我想做一个圆形的窗口然后用位图作背景,本来功能已经实现不过在窗口进行刷新时位图却不能跟着刷新,这是为什么呢?找了好久也没找到问题所在,请各位高手帮忙看看到底是那里的错误.谢谢!
如图:第一次显示在将窗口移到屏幕边上挡住部分然后再移回来后却不能复员图象
如图:代码如下:#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);
}
如图:第一次显示在将窗口移到屏幕边上挡住部分然后再移回来后却不能复员图象
如图:代码如下:#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);
}
解决方案 »
- Refactorying not available symbol
- VS2008下CMFCOutlookbar 标签切换消息的问题
- 我有个关于数据采集卡的问题,具体请各位坛友进来看看,标题说不清楚,谢谢各位!
- VC(DLL)char转 variant
- 请问怎么获得树型控件中某个子结点是其父结点的第几个结点??
- 请问下面的编译错误是什么原因??
- 为什么我使用FindFile找不到指定的文件?
- AfxOleInit()与CoInitialize ()有什么区别呀,请高手指点。
- 有一字符串str,我想取得str的ASCII码,该怎样写代码?
- 谁能发个des算法的组件给我?最好是有源代码的,能用来加密文件即可。谢谢!
- 使用Activx的一个怪问题
- 怎样判断_variant_t变量是否为空
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);
}