C++ 在另一个子窗口的顶部绘制子窗口?
在我的win32应用程序中,我有不同的屏幕用于不同的目的,每个屏幕具有不同的背景。主窗口有自己的静态背景。 我正在使用以下代码在自定义窗口上绘制屏幕背景C++ 在另一个子窗口的顶部绘制子窗口?,c++,winapi,C++,Winapi,在我的win32应用程序中,我有不同的屏幕用于不同的目的,每个屏幕具有不同的背景。主窗口有自己的静态背景。 我正在使用以下代码在自定义窗口上绘制屏幕背景 panelBackground = LoadBitmap ( hInstance, MAKEINTRESOURCE ( bitmap ) ); WNDCLASSEX wincl; wincl.hInstance = hInstance; wincl.lpszClassName = "jPanel"; wincl.lp
panelBackground = LoadBitmap ( hInstance, MAKEINTRESOURCE ( bitmap ) );
WNDCLASSEX wincl;
wincl.hInstance = hInstance;
wincl.lpszClassName = "jPanel";
wincl.lpfnWndProc = WndProc;
wincl.style = CS_BYTEALIGNWINDOW;// | CS_HREDRAW | CS_VREDRAW;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = 0;
wincl.hIconSm = 0;
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 4;
wincl.hbrBackground = ( HBRUSH ) GetStockObject( BLACK_BRUSH );
RegisterClassEx (&wincl);
hwnd = CreateWindowEx ( 0, "jPanel", txt.c_str(), WS_CLIPSIBLINGS | WS_CHILD, x, y, width, height, parent, 0, hInstance, 0) ;
SetWindowLong( hwnd , 0 , ( LONG ) this ) ;
SetWindowPos ( hwnd , HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE ) ;
然后在WndProc中:
view::jPanel* panel = ( view::jPanel* ) GetWindowLong( hwnd , 0 ) ;
case WM_PAINT:
{
if ( ! panel )
return 0 ;
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
GetClientRect( hwnd , &rect ) ;
hdc = BeginPaint( hwnd , &ps ) ;
HDC dcSkin = CreateCompatibleDC ( hdc ); // memory dc for skin
HDC hMemDc = CreateCompatibleDC ( hdc ); // memory dc for painting
HBITMAP hmemBmp = CreateCompatibleBitmap ( hdc, rect.right - rect.left, rect.bottom - rect.top ); // Create bitmap to draw on
HBITMAP hOldMemBmp = (HBITMAP)SelectObject ( hMemDc, hmemBmp ); // select memory bitmap in memory dc
HBITMAP hOldSkinBmp = (HBITMAP)SelectObject ( dcSkin, panel->panelBackground ); //select skin bitmap in skin memory dc
BitBlt ( hMemDc, 0, 0, rect.right - rect.left, rect.bottom - rect.top, dcSkin, 0, 0, SRCCOPY ); // Paint Skin on Memory DC
BitBlt ( hdc, 0, 0, rect.right - rect.left, rect.bottom - rect.top, hMemDc, 0, 0, SRCCOPY ); // Paint Skin on Window DC
//<<<... DeleteDC will leak memory if it holds a resource, so lets select the old bitmap back in the memory DCs
SelectObject ( hMemDc, hOldMemBmp ); // select old bitmaps back to their respective DCs before deleting
SelectObject ( dcSkin, hOldSkinBmp ); // select old bitmaps back to their respective DCs before deleting
DeleteObject ( hOldSkinBmp );
DeleteObject ( hOldMemBmp );
DeleteObject( hmemBmp );
DeleteDC ( hMemDc );
DeleteDC ( dcSkin );
EndPaint( hwnd , &ps ) ;
}
break ;
view::jPanel*面板=(view::jPanel*)GetWindowLong(hwnd,0);
案例WM_油漆:
{
如果(!面板)
返回0;
HDC-HDC;
PAINTSTRUCT-ps;
RECT-RECT;
GetClientRect(hwnd和rect);
hdc=开始喷漆(hwnd和ps);
HDC dcSkin=CreateCompatibleDC(HDC);//用于皮肤的内存dc
HDC hMemDc=CreateCompatibleDC(HDC);//用于绘制的内存dc
HBITMAP hmemBmp=CreateCompatibleBitmap(hdc,rect.right-rect.left,rect.bottom-rect.top);//创建要绘制的位图
HBITMAP hOldMemBmp=(HBITMAP)SelectObject(hMemDc,hmemBmp);//在内存dc中选择内存位图
HBITMAP hOldSkinBmp=(HBITMAP)SelectObject(dcSkin,panel->panelBackground);//在皮肤内存dc中选择皮肤位图
BitBlt(hMemDc,0,0,rect.right-rect.left,rect.bottom-rect.top,dcSkin,0,0,SRCCOPY);//在内存DC上绘制外观
BitBlt(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top,hMemDc,0,0,SRCCOPY);//在窗口DC上绘制蒙皮
// 创建父窗口时添加WS\u CLIPCHILDREN
样式。是的,屏幕背景窗口不是按钮和编辑的父窗口,它是按钮和编辑的同级窗口,它们的父窗口都具有WS\u CLIPCHILDREN样式。