[Bug 50456] cannot draw non-client area

WineHQ Bugzilla wine-bugs at winehq.org
Mon Jan 4 21:03:47 CST 2021


https://bugs.winehq.org/show_bug.cgi?id=50456

Haoyang Chen <chenhaoyang at uniontech.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
  Attachment #69070|IDE:visual c++ 2008 express |demo(IDE:visual c++ 2008
        description|edition                     |express edition)

--- Comment #1 from Haoyang Chen <chenhaoyang at uniontech.com> ---
Comment on attachment 69070
  --> https://bugs.winehq.org/attachment.cgi?id=69070
demo(IDE:visual c++ 2008 express edition)

>// test_NCCALCSIZE.cpp : ¶¨ÒåÓ¦ÓóÌÐòµÄÈë¿Úµã¡£
>//
>
>#include "stdafx.h"
>#include "test_NCCALCSIZE.h"
>
>#define MAX_LOADSTRING 100
>
>// È«¾Ö±äÁ¿:
>HINSTANCE hInst;								// µ±Ç°ÊµÀý
>TCHAR szTitle[MAX_LOADSTRING];					// ±êÌâÀ¸Îı¾
>TCHAR szWindowClass[MAX_LOADSTRING];			// Ö÷´°¿ÚÀàÃû
>
>// ´Ë´úÂëÄ£¿éÖаüº¬µÄº¯ÊýµÄÇ°ÏòÉùÃ÷:
>ATOM				MyRegisterClass(HINSTANCE hInstance);
>BOOL				InitInstance(HINSTANCE, int);
>LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
>INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);
>
>int APIENTRY _tWinMain(HINSTANCE hInstance,
>                     HINSTANCE hPrevInstance,
>                     LPTSTR    lpCmdLine,
>                     int       nCmdShow)
>{
>	UNREFERENCED_PARAMETER(hPrevInstance);
>	UNREFERENCED_PARAMETER(lpCmdLine);
>
> 	// TODO: ÔÚ´Ë·ÅÖôúÂë¡£
>	MSG msg;
>	HACCEL hAccelTable;
>
>	// ³õʼ»¯È«¾Ö×Ö·û´®
>	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
>	LoadString(hInstance, IDC_TEST_NCCALCSIZE, szWindowClass, MAX_LOADSTRING);
>	MyRegisterClass(hInstance);
>
>	// Ö´ÐÐÓ¦ÓóÌÐò³õʼ»¯:
>	if (!InitInstance (hInstance, nCmdShow))
>	{
>		return FALSE;
>	}
>
>	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TEST_NCCALCSIZE));
>
>	// Ö÷ÏûϢѭ»·:
>	while (GetMessage(&msg, NULL, 0, 0))
>	{
>		if (!TranslateAcceleratorW(msg.hwnd, hAccelTable, &msg))
>		{
>			TranslateMessage(&msg);
>			DispatchMessage(&msg);
>		}
>	}
>
>	return (int) msg.wParam;
>}
>
>
>
>//
>//  º¯Êý: MyRegisterClass()
>//
>//  Ä¿µÄ: ×¢²á´°¿ÚÀà¡£
>//
>//  ×¢ÊÍ:
>//
>//    ½öµ±Ï£Íû
>//    ´Ë´úÂëÓëÌí¼Óµ½ Windows 95 Öеġ°RegisterClassEx¡±
>//    º¯Êý֮ǰµÄ Win32 ϵͳ¼æÈÝʱ£¬²ÅÐèÒª´Ëº¯Êý¼°ÆäÓ÷¨¡£µ÷Óô˺¯ÊýÊ®·ÖÖØÒª£¬
>//    ÕâÑùÓ¦ÓóÌÐò¾Í¿ÉÒÔ»ñµÃ¹ØÁªµÄ
>//    ¡°¸ñʽÕýÈ·µÄ¡±Ð¡Í¼±ê¡£
>//
>ATOM MyRegisterClass(HINSTANCE hInstance)
>{
>	WNDCLASSEX wcex;
>
>	wcex.cbSize = sizeof(WNDCLASSEX);
>
>	wcex.style			= CS_HREDRAW | CS_VREDRAW;
>	wcex.lpfnWndProc	= WndProc;
>	wcex.cbClsExtra		= 0;
>	wcex.cbWndExtra		= 0;
>	wcex.hInstance		= hInstance;
>	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST_NCCALCSIZE));
>	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
>	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
>	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_TEST_NCCALCSIZE);
>	wcex.lpszClassName	= szWindowClass;
>	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
>
>	return RegisterClassEx(&wcex);
>}
>
>//
>//   º¯Êý: InitInstance(HINSTANCE, int)
>//
>//   Ä¿µÄ: ±£´æʵÀý¾ä±ú²¢´´½¨Ö÷´°¿Ú
>//
>//   ×¢ÊÍ:
>//
>//        Ôڴ˺¯ÊýÖУ¬ÎÒÃÇÔÚÈ«¾Ö±äÁ¿Öб£´æʵÀý¾ä±ú²¢
>//        ´´½¨ºÍÏÔʾÖ÷³ÌÐò´°¿Ú¡£
>//
>BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
>{
>   HWND hWnd;
>
>   hInst = hInstance; // ½«ÊµÀý¾ä±ú´æ´¢ÔÚÈ«¾Ö±äÁ¿ÖÐ
>
>hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
>      20, 60, 800, 600, NULL, NULL, hInstance, NULL);
>
>   if (!hWnd)
>   {
>      return FALSE;
>   }
>
>   ShowWindow(hWnd, nCmdShow);
>   SW_SHOWNORMAL;
>   UpdateWindow(hWnd);
>
>   return TRUE;
>}
>
>//
>//  º¯Êý: WndProc(HWND, UINT, WPARAM, LPARAM)
>//
>//  Ä¿µÄ: ´¦ÀíÖ÷´°¿ÚµÄÏûÏ¢¡£
>//
>//  WM_COMMAND	- ´¦ÀíÓ¦ÓóÌÐò²Ëµ¥
>//  WM_PAINT	- »æÖÆÖ÷´°¿Ú
>//  WM_DESTROY	- ·¢ËÍÍ˳öÏûÏ¢²¢·µ»Ø
>//
>//
>LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
>{
>	int wmId, wmEvent;
>	PAINTSTRUCT ps;
>	HDC hdc;
>
>	switch (message)
>	{
>	case WM_COMMAND:
>		wmId    = LOWORD(wParam);
>		wmEvent = HIWORD(wParam);
>		// ·ÖÎö²Ëµ¥Ñ¡Ôñ:
>		switch (wmId)
>		{
>		case IDM_ABOUT:
>			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
>			break;
>		case IDM_EXIT:
>			DestroyWindow(hWnd);
>			break;
>		default:
>			return DefWindowProc(hWnd, message, wParam, lParam);
>		}
>		break;
>	case WM_PAINT:
>		{
>		hdc = BeginPaint(hWnd, &ps);
>		// TODO: ÔÚ´ËÌí¼ÓÈÎÒâ»æͼ´úÂë...
>		HBRUSH brush = CreateSolidBrush(0x00888888);
>		int ret = FillRect(hdc, &ps.rcPaint, brush);
>		EndPaint(hWnd, &ps);
>		break;
>		}
>	case WM_NCPAINT:
>		{
>			RECT rect;
>			GetWindowRect(hWnd, &rect);
>			HRGN region = NULL;
>			int edg_x = GetSystemMetrics(SM_CXEDGE);
>			int edg_y = GetSystemMetrics(SM_CYEDGE);
>			if (wParam == NULLREGION) {
>				region = CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);
>			}
>			else {
>				HRGN copy = CreateRectRgn(0, 0, 0, 0);
>				if (CombineRgn(copy, (HRGN)wParam, NULL, RGN_COPY)) {
>					region = copy;
>				}
>				else {
>					DeleteObject(copy);
>				}
>			}
>
>			HDC dc = GetDCEx(hWnd, region, DCX_WINDOW | DCX_CACHE | DCX_INTERSECTRGN | DCX_LOCKWINDOWUPDATE);
>			if (!dc && region) {
>				DeleteObject(region);
>			}
>			HBRUSH brush = CreateSolidBrush(0x0066666);
>			OffsetRect(&rect,-rect.left, -rect.top);
>			int ret = FillRect(dc, &rect, brush);
>			rect.top = edg_x;
>			rect.bottom = GetSystemMetrics(SM_CYSMCAPTION) + edg_x;
>			SetBkMode(dc, TRANSPARENT);
>			DrawTextA(dc, "  ³Â´óÏÀµÄWM_NCCALCSIZE", -1, &rect, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
>			DeleteObject(brush);
>			break;
>		}
>case WM_NCCALCSIZE:
>	{
>		int xFrame = GetSystemMetrics(SM_CXEDGE); /*×óÓұ߿òµÄºñ¶È*/
>		int yFrame = GetSystemMetrics(SM_CYEDGE); /*ϱ߿òµÄºñ¶È*/
>		int nTHight = GetSystemMetrics(SM_CYSMCAPTION) + GetSystemMetrics(SM_CYMENU); /*±êÌâÀ¸µÄ¸ß¶È*/
>		NCCALCSIZE_PARAMS * p; /*TRUEÊǵÄÖ¸Õë*/
>		RECT * rc; /*FALSEÊǵÄÖ¸Õë*/
>		RECT aRect;
>		RECT bRect;
>		RECT bcRect;
>
>
>	if(wParam == TRUE)
>	{
>		p = (NCCALCSIZE_PARAMS *)lParam; 
>
>
>		/*¸´ÖÆA B¾ØÐÎλÖÃ*/
>		CopyRect(&aRect,&p->rgrc[1]); 
>		CopyRect(&bRect,&p->rgrc[0]);
>
>
>		/*Ö¸¶¨BCµÄ¾ØÐεÄλÖÃ*/
>		bcRect.left = bRect.left + xFrame;
>		bcRect.top = bRect.top + nTHight;
>		bcRect.right = bRect.right - xFrame;
>		bcRect.bottom = bRect.bottom - yFrame;
>
>
>		/*¸÷¸ö¾ØÐιéλ³ÉBC B A*/
>		CopyRect(&p->rgrc[0],&bcRect);
>		CopyRect(&p->rgrc[1],&bRect);
>		CopyRect(&p->rgrc[2],&aRect);
>		}
>		else
>		{
>			rc = (RECT *)lParam;
>			rc->left = rc->left + xFrame;
>			rc->top = rc->top + yFrame;
>			rc->right = rc->right - xFrame;
>			rc->bottom = rc->bottom - yFrame;
>		}
>		break;
>	}
>	case WM_NCACTIVATE:
>        RedrawWindow(hWnd, NULL, NULL, RDW_UPDATENOW);
>		if (!wParam)
>		{
>			return 1;
>		}
>		break;
>	case WM_DESTROY:
>		PostQuitMessage(0);
>		break;
>	default:
>		return DefWindowProc(hWnd, message, wParam, lParam);
>	}
>	return 0;
>}
>
>// ¡°¹ØÓÚ¡±¿òµÄÏûÏ¢´¦Àí³ÌÐò¡£
>INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
>{
>	UNREFERENCED_PARAMETER(lParam);
>	switch (message)
>	{
>	case WM_INITDIALOG:
>		return (INT_PTR)TRUE;
>
>	case WM_COMMAND:
>		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
>		{
>			EndDialog(hDlg, LOWORD(wParam));
>			return (INT_PTR)TRUE;
>		}
>		break;
>	}
>	return (INT_PTR)FALSE;
>}

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.


More information about the wine-bugs mailing list