读书人

【SDK编程】指教,该怎么解决

发布时间: 2012-03-13 11:21:11 作者: rapoo

【SDK编程】指教
源代码:

C/C++ code
#include <windows.h>#include "resource.h"HINSTANCE hThisInstance;LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam){    HDC hdc;    PAINTSTRUCT ps;    HBITMAP bitmap,OldBmp;    HDC hMemDC;    RECT rc;    switch(message)    {    case WM_CREATE:        return 0;    case WM_PAINT:        hdc=BeginPaint(hWnd,&ps);        hMemDC=CreateCompatibleDC(hdc);        bitmap=LoadBitmap(hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1));        OldBmp=(HBITMAP)SelectObject(hMemDC,(HGDIOBJ)bitmap);        GetWindowRect(hWnd,&rc);        BitBlt(            hdc,            0,            0,            rc.left-rc.right,            rc.top-rc.bottom,            hMemDC,            0,            0,            SRCCOPY            );        SelectObject(hMemDC,(HGDIOBJ)OldBmp);        DeleteDC(hMemDC);        EndPaint(hWnd,&ps);        return 0;    case WM_DESTROY:        PostQuitMessage(0);        return 0;    }    return DefWindowProc(hWnd,message,wParam,lParam);}int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){    hThisInstance=hInstance;    HWND hWnd;    MSG msg;    WNDCLASS c;    c.cbClsExtra=0;    c.cbWndExtra=0;    c.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);    c.hCursor=LoadCursor(NULL,IDC_ARROW);    c.hIcon=LoadIcon(NULL,IDI_APPLICATION);    c.hInstance=hInstance;    c.lpfnWndProc=WndProc;    c.lpszClassName="Frame";    c.lpszMenuName=NULL;    c.style=CS_HREDRAW | CS_VREDRAW;    RegisterClass(&c);    hWnd=CreateWindow(        "Frame",        "Frame",        WS_OVERLAPPEDWINDOW,        CW_USEDEFAULT,        CW_USEDEFAULT,        CW_USEDEFAULT,        CW_USEDEFAULT,        NULL,        NULL,        hInstance,        NULL        );    ShowWindow(hWnd,nCmdShow);    UpdateWindow(hWnd);    while(GetMessage(&msg,hWnd,0,0)&&msg.message!=WM_QUIT)    {        TranslateMessage(&msg);        DispatchMessage(&msg);    }    return msg.wParam;}

问题:运行的时候图片出不来

[解决办法]
参数写错了:
C/C++ code
BitBlt(            hdc,            0,            0,            rc.right-rc.left, // 这样写            rc.bottom-rc.top, // 这样写            hMemDC,            0,            0,            SRCCOPY            );
[解决办法]
你那样写宽高成负数了,这样图像就画到屏幕外面了,屏幕坐标以左上角为原点(0,0),往右为X轴正方向,向下为Y轴正方向。
----------------------------------------
函数原型

  BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);
编辑本段
参数

  hdcDest:指向目标设备环境的句柄。
  nXDest:指定目标矩形区域左上角的X轴逻辑坐标。
  nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。
  nWidth:指定源和目标矩形区域的逻辑宽度。
  nHeight:指定源和目标矩形区域的逻辑高度。
  hdcSrc:指向源设备环境的句柄。
  nXSrc:指定源矩形区域左上角的X轴逻辑坐标。
  nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。
  dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。
  下面列出了一些常见的光栅操作代码:
  BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。
  DSTINVERT:表示使目标矩形区域颜色取反。
  MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。
  MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。
  NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。
  NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。
  PATCOPY:将特定的模式拷贝到目标位图上。
  PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。
  PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。
  SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。
  SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。
  SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。
  SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。
  SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。
  WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。

读书人网 >C++

热点推荐