none
求高人 出手 RRS feed

  • 问题

  • 这个程序一直没有实现 ,就是想给屏幕拍照,然后放入剪切板,这点做好了。
    卡壳的地方是需要把图从剪切板拷出来显示到程序的窗口。
    这段程序运行正常,但是屏幕是白色的,并没有显示出屏幕的截取效果。

    请高人出手
    代码如下:

    #include <windows.h>


    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("screen") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;

         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;

         if (!RegisterClass (&wndclass))
         {
              MessageBox (NULL, TEXT ("Program requires Windows NT!"),
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }

         hwnd = CreateWindow (szAppName, TEXT ("Digital Clock"),
                              WS_POPUP|WS_DLGFRAME|WS_VISIBLE, //WS_OVERLAPPEDWINDOW| WS_MAXIMIZE,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              NULL, NULL, hInstance, NULL) ;

         ShowWindow (hwnd, SW_MAXIMIZE);// iCmdShow) ;
         UpdateWindow (hwnd) ;

         while (GetMessage (&msg, NULL, 0, 0))
              {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
              }
         return msg.wParam ;
         }

     

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         static BOOL   f24Hour, fSuppress ;
         static HBRUSH hBrushRed ;
         static int    cxClient, cyClient ;
         HDC           hdc ;
         PAINTSTRUCT   ps ;
         TCHAR         szBuffer [2] ;
       HGDIOBJ hMem;  // HBITMAP hMem; 
      HDC compdc;

         switch (message)
         {
         case WM_CREATE:
              hBrushRed = CreateSolidBrush (RGB (255, 0, 0)) ;
        keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0); //get screen snapshot into clipboard
        OpenClipboard(NULL);
        hMem = GetClipboardData(CF_BITMAP);  

       case WM_SETTINGCHANGE:
             
              return 0 ;

         case WM_SIZE:
              cxClient = LOWORD (lParam) ;
              cyClient = HIWORD (lParam) ;
              return 0 ;

         case WM_TIMER:
              InvalidateRect (hwnd, NULL, TRUE) ;
              return 0 ;

         case WM_PAINT:
              hdc = BeginPaint (hwnd, &ps) ;
       compdc = CreateCompatibleDC(hdc);
              SelectObject(compdc,hMem);
        BitBlt(hdc,0,0,cxClient,cyClient,compdc,20,20,SRCCOPY);

              EndPaint (hwnd, &ps) ;
              return 0 ;
         case WM_KEYDOWN:
         switch(wParam)
         {
         case VK_ESCAPE:
                      DeleteObject (hBrushRed);
                     PostQuitMessage (0) ;
         }

         case WM_DESTROY:
           
              DeleteObject (hBrushRed) ;
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }

    2009年10月7日 7:12

答案

  •          hdc = BeginPaint (hwnd, &ps) ;
       compdc = CreateCompatibleDC(hdc);
              SelectObject(compdc,hMem);
        BitBlt(hdc,0,0,cxClient,cyClient,compdc,20,20,SRCCOPY);

              EndPaint (hwnd, &ps) ;
              return 0 ;

    hMem是个局部变量,未初始化或者赋值,在WM_PAINT中SelectObject是不会成功的。


    0xBAADF00D
    2009年10月23日 1:57
    版主

全部回复

  • 这个问题,最好是把工程发过来,调试一下啊
    2009年10月22日 8:41
  •          hdc = BeginPaint (hwnd, &ps) ;
       compdc = CreateCompatibleDC(hdc);
              SelectObject(compdc,hMem);
        BitBlt(hdc,0,0,cxClient,cyClient,compdc,20,20,SRCCOPY);

              EndPaint (hwnd, &ps) ;
              return 0 ;

    hMem是个局部变量,未初始化或者赋值,在WM_PAINT中SelectObject是不会成功的。


    0xBAADF00D
    2009年10月23日 1:57
    版主