设为首页 加入收藏

TOP

窗体皮肤实现 - 在VC中简单实现绘制(五)(一)
2014-11-23 17:31:44 】 浏览:546
Tags:窗体 皮肤 实现 简单 绘制
代码中处理了四个消息,还是比较简单。只有 WM_WINDOWPOSCHANGING 消息的处理稍微长些。
WM_NCPAINT --- 绘制非客户区
WM_NCCALCSIZE --- 重新设置边缘宽度
WM_NCACTIVATE --- 程序切换时重绘非客户去
WM_WINDOWPOSCHANGING --- 重设界面样式
重新绘制非客户区 WM_NCPAINT
复制代码
// LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_NCPAINT:
hdc = GetWindowDC(hWnd);
PaintNC(hWnd, hdc);
ReleaseDC(hWnd, hdc);
break;
// 非客户去绘制
void PaintNC(HWND hWnd, HDC dc)
{
HBRUSH hBrush;
RECT rw;
RECT rc;
POINT pt;
GetWindowRect(hWnd, &rw);
GetClientRect(hWnd, &rc);
pt.x = rc.left;
pt.y = rc.top;
ClientToScreen(hWnd, &pt);
OffsetRect(&rc, pt.x - rw.left, pt.y - rw.top);
ExcludeClipRect(dc, rc.left, rc.top, rc.right, rc.bottom); // 扣除客户区
OffsetRect(&rw, -rw.left, -rw.top);
hBrush = CreateSolidBrush(0xBF7B18);
FillRect(dc, &rw, hBrush);
DeleteObject(hBrush);
}
复制代码
重新设置窗体边缘宽度 WM_NCCALCSIZE
复制代码
1 // 设置窗体边框宽度
2 case WM_NCCALCSIZE:
3 ((LPNCCALCSIZE_PARAMS)lParam)->rgrc[0].left += 3;
4 ((LPNCCALCSIZE_PARAMS)lParam)->rgrc[0].top += 55;
5 ((LPNCCALCSIZE_PARAMS)lParam)->rgrc[0].right -= 4;
6 ((LPNCCALCSIZE_PARAMS)lParam)->rgrc[0].bottom -= 4;
7 break;
复制代码
切换程序时重绘非客户去WM_NCACTIVATE
1 case WM_NCACTIVATE:
2 PostMessage(hWnd, WM_NCPAINT, 1, 0);
3 break;
设置窗体样式 WM_WINDOWPOSCHANGING
复制代码
1 // 有修改窗体尺寸时重设样式
2 //
3
4 case WM_WINDOWPOSCHANGING:
5 bChanged = FALSE;
6 if (!gChangeSizeCalled) {
7 bChanged = (((LPWINDOWPOS)lParam)->flags & SWP_FRAMECHANGED);
8 if ((((LPWINDOWPOS)lParam)->flags & SWP_NOMOVE) == 0){
9 gWindowSize.left = ((LPWINDOWPOS)lParam)->x;
10 gWindowSize.top = ((LPWINDOWPOS)lParam)->y;
11 }
12 if ((((LPWINDOWPOS)lParam)->flags & SWP_NOSIZE) == 0){
13 bChanged = bChanged || (((LPWINDOWPOS)lParam)->cx != gWindowSize.right) || (((LPWINDOWPOS)lParam)->cy != gWindowSize.bottom);
14 gWindowSize.right = ((LPWINDOWPOS)lParam)->cx;
15 gWindowSize.bottom = ((LPWINDOWPOS)lParam)->cy;
16 }
17 bChanged = bChanged && ((gWindowSize.right * gWindowSize.bottom) != 0);
18
19 if (bChanged){
20 gChangeSizeCalled = TRUE;
21 __try {
22 hTmp = gRegion;
23 gRegion = CreateRoundRectRgn(0, 0, gWindowSize.right, gWindowSize.bottom, 3, 3);
24 SetWindowRgn(hWnd, gRegion, TRUE);
25 if (hTmp)
26 DeleteObject(hTmp);
27 }
28 __finally {
29 gChangeSizeCalled = FALSE;
30 }
31 }
32 }
33
34 if (!bChanged)
35 return DefWindowProc(hWnd,message, wParam, lParam);
36
37 break;
1 // skin.cpp : Defines the entry point for the application.
2 //
3
4 #include "stdafx.h"
5 #include "skin.h"
6
7 #define MAX_LOADSTRING 100
8
9 // Global Variables:
10 HINSTANCE hInst; // current instance
11 TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
12 TCHAR szWindowClass[MAX_
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇VC #define EC(x) L##x 作用说明 下一篇VC版超级记事本

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目