【Demo 0044】带皮肤的窗体

我们常常看到许多软件如QQ, 360, 金山词霸等都非常的漂亮,看不到我们通常看到的Window窗体和控件。 本节我们学习一下,当然技术上也是老话重谈,有点点技术就是双重缓冲的解决切换闪烁的问题.

一、关键代码

    1. 载入一个背影到内存(确保窗体与背影大小一致)

CREATESTRUCT cs = *( CREATESTRUCT *) lParam ;
hBmpBK = LoadBitmap ( cs . hInstance , MAKEINTRESOURCE ( IDB_BACKGROUND ));
BITMAP bmp ;
GetObject ( hBmpBK , sizeof ( BITMAP ), ( LPVOID )& bmp );
MoveWindow ( hWnd , 0, 0, bmp . bmWidth , bmp . bmHeight , FALSE );

    2.  双缓冲绘图(一个作图缓冲, 作完图再绘到显示缓冲上)

case WM_PAINT :
{
     RECT rtClient ;
     GetClientRect ( hWnd , & rtClient );

     PAINTSTRUCT ps ;
     HDC hDC         = BeginPaint ( hWnd , & ps );    
     HDC hMemDC = CreateCompatibleDC ( hDC );
     HBITMAP hBitmap = CreateCompatibleBitmap ( hDC , rtClient . right - rtClient . left , rtClient . bottom - rtClient . top );
     SelectObject ( hMemDC , hBitmap );    
     BitBlt ( hDC , 0, 0, rtClient . right - rtClient . left , rtClient . bottom - rtClient . top , hMemDC , 0, 0, SRCCOPY );
     DeleteObject ( hMemDC );        
     DeleteObject ( hBitmap );
     EndPaint ( hWnd , & ps );

     return 0;
}

二、程序效果

    image

 

演示代码

你可能感兴趣的:(demo)