16,551
社区成员
发帖
与我相关
我的任务
分享
HBITMAP hBitmap = NULL; // 全局变量load pic
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
//消息分类处理
switch (iMsg) {
//客户区的绘制消息
case WM_PAINT:
{
hDC hMemDC1, hMemDC2; // 两个
HBITMAP hBG; // 客户区背景
BITMAP bm;
PAINTSTRUCT ps;
HDC hDC = BeginPaint( hWnd, &ps );
RECT rect;
GetClientRect( hWnd, &rect );
int w = rect.right - rect.left; // 客户区宽
int h = rect.bottom - rect.top; // ......高
// Create bg dc & bitmap
hMemDC1 = CreateCompatibleDC( hDC );
hBG = CreateCompatibleBitmap( hDC, w, h );
HBITMAP hOld1 = ( HBITMAP )SelectObject( hMemDC1, hBG );
FillRect( hMemDC1, &rect, GetStockObject( WHITE_BRUSH ) );
// load pic
if( !hBitmap )
hBitmap = ( HBITMAP )LoadImage(NULL,"pic.bmp",IMAGE_BITMAP, 0 ,0,LR_LOADFROMFILE);
GetObject( hBitmap, sizeof( BITMAP ), &bm );
hMemDC2 = CreateCompatibleDC( hDC );
HBITMAP hOld2 = ( HBITMAP )SelectObject( hMemDC2, hBitmap );
POINT pt;
GetCursorPos(&pt);
// 计算位置
ScreenToClient( hWnd, &pt );
pt.x = pt.x - bm.bmWidth / 2;
pt.y = pt.y - bm.bmHeight / 2;
// pic to bg
BitBlt( hMemDC1, pt.x, pt.y, bm.bmWidth, bm.bmHeight, hMemDC2, 0, 0, SRCCOPY );
SetBkMode( hMemDC1, TRANSPARENT );
SetTextColor( hMemDC1, RGB( 255, 0, 0 ) );
DrawText( hMemDC1, TEXT( "Hello, Win32!" ), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
// bg to client
BitBlt( hDC, 0, 0, w, h, hMemDC1, 0, 0, SRCCOPY );
// all finish, release
SelectObject( hMemDC1, hOld1 );
SelectObject( hMemDC2, hOld2 );
DeleteDC( hMemDC1 );
DeleteDC( hMemDC2 );
DeleteObject( hBG );
EndPaint( hWnd, &ps );
return 0;
}
case WM_MOUSEMOVE:
{
InvalidateRect(hWnd, NULL, FALSE);
//invalidate( FALSE );
UpdateWindow(hWnd);
break;
}
case WM_DESTROY:
{
//发送WM_QUIT消息,通知线程消息检索循环,主程序可以退出
//release
if( hBitmap )
DeleteObject( hBitmap );
PostQuitMessage(0);
return 0;
}
case WM_ERASEBKGND:
{
return 1; // return true
}
}
//程序末处理的消息交给window系统的缺省窗口对象的过程处理函数处理
return DefWindowProc(hWnd, iMsg, wParam,lParam);
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
//消息分类处理
switch (iMsg)
{
//客户区的绘制消息
case WM_PAINT:
{
HDC hdc;
HBITMAP hbm;
BITMAP bmp;
PAINTSTRUCT ps; //绘制属性结构描述
HDC hDC = BeginPaint(hWnd, &ps); //获取显示设备对象及绘制描述属性
RECT rect;
GetClientRect(hWnd, &rect);//获取当前窗口对象客户区矩形
SetBkMode(hDC,TRANSPARENT);//设置背景方式
SetTextColor(hDC, RGB(255, 0, 0));//设置文本颜色
//绘制文本
hbm=(HBITMAP)LoadImage(NULL,"pic.bmp",IMAGE_BITMAP, 0 ,0,LR_LOADFROMFILE);
hdc = CreateCompatibleDC(ps.hdc);
SelectObject(hdc,hbm);
GetObject(hbm,sizeof(BITMAP),&bmp);
POINT pt;
GetCursorPos(&pt);
// 计算位置
ScreenToClient(hWnd, &pt);
pt.x = pt.x - bmp.bmWidth / 2;
pt.y = pt.y - bmp.bmHeight / 2;
BitBlt(ps.hdc,pt.x,pt.y,bmp.bmWidth,bmp.bmHeight,hdc,0,0,SRCCOPY);
DrawText(hDC, TEXT("Hello, Win32!"), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
EndPaint(hWnd, &ps); //客户区绘制结束,归还显示设备对象
DeleteObject(hbm);
DeleteDC(hdc);
EndPaint(hWnd,&ps);
return 0;
}
case WM_MOUSEMOVE:
{
InvalidateRect(hWnd, NULL, FALSE);
//invalidate( FALSE );
UpdateWindow(hWnd);
break;
}
case WM_DESTROY:
{
//发送WM_QUIT消息,通知线程消息检索循环,主程序可以退出
PostQuitMessage(0);
return 0;
}
}
//程序末处理的消息交给window系统的缺省窗口对象的过程处理函数处理
return DefWindowProc(hWnd, iMsg, wParam,lParam);
}