我想做一个圆形的窗口然后用位图作背景,本来功能已经实现不过在窗口进行刷新时位图却不能跟着刷新,这是为什么呢?找了好久也没找到问题所在,请各位高手帮忙看看到底是那里的错误.谢谢!
如图:第一次显示在将窗口移到屏幕边上挡住部分然后再移回来后却不能复员图象
如图:代码如下:#include <windows.h>
#include <stdio.h> 
LRESULT CALLBACK wndproc(HWND,UINT,WPARAM,LPARAM);
 
HBITMAP hbitback,hbitcircle1,hbitcircle2,hbitmask1,hbitmask2;
static HINSTANCE hinst;
HRGN hrgn;
void setwindow(HWND hwnd,HRGN hrgn,int x,int y,int cx,int cy)
{
SetWindowRgn(hwnd,hrgn,TRUE);
SetWindowPos(hwnd,HWND_TOPMOST,x,y,cx,cy,SWP_NOMOVE||SWP_NOSIZE);}void setback  (HWND hwnd,HBITMAP hbmpback,HBITMAP hbmpcrircle,HBITMAP hbmpmask,int cx,int cy)
{
         HDC hdcmain,hdcbmp;
         //int bx,by;
         BITMAP bitmap;//位图对象(临时)
         RECT clientrect;//客户区矩形         hdcmain=GetDC(hwnd);
       
         hdcbmp=CreateCompatibleDC(hdcmain);
         GetClientRect(hwnd,&clientrect);
         
          SelectObject(hdcbmp,hbmpback);
          GetObject(hbmpback,sizeof BITMAP,&bitmap);
          SetStretchBltMode(hdcmain,COLORONCOLOR);
          StretchBlt(hdcmain,0,0,cx,cy,hdcbmp,0,0,bitmap.bmWidth,bitmap.bmHeight,MERGECOPY);
          //BitBlt,hdcmain,0,0,300,300,hdcbmp,0,0,MERGECOPY
          DeleteObject(hbmpback);
  ReleaseDC(hwnd,hdcmain);
}
int WINAPI WinMain (HINSTANCE hinstance,HINSTANCE hprevinstance,LPSTR lpcndline,int ncmdshow)
{

hinst=hinstance;
static TCHAR szclassname[]=TEXT("SIMCHILDWINSAMPLECLASS");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
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=szclassname;
 
    
if(!RegisterClass(&wndclass))
{return 0;
}
hwnd=CreateWindow(szclassname,
                NULL,
                        WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hinstance,
NULL,
);
ShowWindow(hwnd,ncmdshow);
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){
HDC hdc;
PAINTSTRUCT ps;
 
switch(message)
{
case WM_CREATE:
hbitback=LoadBitmap(hinst,TEXT("BITBACK"));
hbitcircle1=LoadBitmap(hinst,TEXT("BITCIRCLE1"));
hbitcircle2=LoadBitmap(hinst,TEXT("BITCIRCLE2"));
hbitmask1=LoadBitmap(hinst,TEXT("BITMASK1"));
hbitmask2=LoadBitmap(hinst,TEXT("BITMASK2"));
hrgn=CreateEllipticRgn(0,0,600,600);
setwindow(hwnd,hrgn,0,0,600,600);return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
setback  (hwnd,hbitback,hbitcircle1,hbitmask1,600,600);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wparam,lparam);
}

解决方案 »

  1.   

    你的主要问题出在setback函数上,我改了一下,实验成功:
    void setback  (HWND hwnd,HBITMAP hbmpback,HBITMAP hbmpcrircle,HBITMAP hbmpmask,int cx,int cy) 

            HDC hdcmain,hdcbmp; 
            //int bx,by; 
            BITMAP bitmap;//位图对象(临时) 
            RECT clientrect;//客户区矩形         hdcmain=GetDC(hwnd); 
          
            hdcbmp=CreateCompatibleDC(hdcmain); 
            GetClientRect(hwnd,&clientrect); 
            
    HBITMAP hbitmap=(HBITMAP)SelectObject(hdcbmp,hbmpback); //这个要加上,因为hdcbmp在删除之前要恢复原来的位图。
              GetObject(hbmpback,sizeof BITMAP,&bitmap); 
              SetStretchBltMode(hdcmain,COLORONCOLOR); 
             StretchBlt(hdcmain,0,0,cx,cy,hdcbmp,0,0,bitmap.bmWidth,bitmap.bmHeight,MERGECOPY);
     
              //BitBlt,hdcmain,0,0,300,300,hdcbmp,0,0,MERGECOPY 
             // DeleteObject(hbmpback);//这个要去掉,如果hbmpback被删除了,第二次执行时就无法加载了。
     SelectObject(hdcbmp,hbitmap);//删除hdcbmp之前要将你产生的GDI对象拿出来。
     DeleteDC(hdcbmp);
      ReleaseDC(hwnd,hdcmain);