在Windows应用程序中,对话框是应用最广泛也是比较难控制其风格(外表)的
一类窗口。Windows 3.x所提供的传统的对话框一般都有一个单调的蓝色的边框
和白色窗口背景,即使采用Borland C++所提供的BorDlg风格的对话框,用自定义
控制(BWCC)来美化对话框的背景及内容,呆板的边框还是一成不变的。相信用过
Windows 95的朋友在享受其强大功能的同时,一定也为它所提供的具有立体感的
界面而感叹吧。事实上,在Windows 3.x中,我们也是可以作出更美观的窗口来
的,中文之星2.0就是一个很好的例子。
要想按自己的意愿来绘制一个普通窗口或对话框的边界,一般来说有两种方
法:一种是在系统绘制边框之后再在其上重新绘制一遍;另一种是彻底接管对边框
的绘制权,禁止系统的干涉。前一种方法对于含有菜单的窗口较为适应,能够保证
窗口始终以自定义方式出现,但是在
窗口更新时,这种方式会产生闪烁现象;第二种方式比较适应于没有菜单的窗口,
更新时不会发生闪烁现象,但是如果处理不好有时系统会暂时重新获得绘制权,使
得窗口以另外一种形象出现。下面作者要介绍的方法将结合使用这两种方法,以
求取得较好的效果。
在一个窗口的边界(非用户区)需要重画时,窗口将接到消息WM_NCPAINT,通常
该消息将被传送给窗口的DefWndProc函数进行缺省的处理,我们只要使应用程序
处理这个消息而不是交给Windows就可以实现第二种方法。由于对话框有许多普
通窗口不具有的特性,因此如果希望比较完善地控制对话框的风格,还要适当用第
一种方式做辅助。作者采取的做法为每当对话框被激活时都重画一遍。
下面就是笔者基于以上思想而编制的一个边界有立体效果的对话框类。将
该类做成通用的动态连接库就可以供其他程序使用。
//以下为头文件说明
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
#if !defined(_NEW_STYLE_DIALOG_)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
#define _NEW_STYLE_DIALOG_
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
#include <owl.h>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
extern PTModule TheModule;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
_CLASSDEF(TNewDialog)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
class TNewDialog : public TDialog
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
HPEN DarkGrayPen,LightGrayPen;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
HPEN WhitePen,BlackPen;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
HBRUSH LightGrayBrush,BlueBrush;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
HBRUSH NullBrush;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
void CreateDrawObject(void);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public:
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
TNewDialog(PTWindowsObject AParent, LPSTR AName, PTModule AModule = NULL)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
:TDialog(AParent,AName,AModule)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ CreateDrawObject(); }
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
TNewDialog(PTWindowsObject AParent, int
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ResourceId, PTModule AModule = NULL)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
:TDialog(AParent,ResourceId,AMod-ule)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ CreateDrawObject(); }
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
~TNewDialog();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
virtual void WMNCPaint(RTMessage Msg)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
=[WM_FIRST+WM_NCPAINT];
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
virtual void WMActivate(RTMessage Msg)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
=[WM_FIRST+WM_ACTIVATE];
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
void DrawFrame(); };
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
#endif
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//以下为动态连接库和类成员函数体
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
#include "newdlg.h"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
PTModule TheModule;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
int FAR PASCAL LibMain(HINSTANCE hIn-stance, WORD , WORD , LPSTR lpCmd
-Line)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int TheStatus;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
TheModule = new TModule("NEWDL-GDLL",hInstance, lpCmdLine);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
TheStatus = TheModule->Status;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if ( TheStatus != 0 )
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
delete TheModule;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
TheModule = NULL; }
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return (TheStatus == 0);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
int FAR PASCAL WEP ( int /**//*bSystemExit*/ )
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{return 1;}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
TNewDialog::~TNewDialog()
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DeleteObject(DarkGrayPen);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DeleteObject(LightGrayPen);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DeleteObject(WhitePen);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DeleteObject(BlackPen);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DeleteObject(LightGrayBrush);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DeleteObject(BlueBrush);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DeleteObject(NullBrush);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
void TNewDialog::CreateDrawObject(void)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DarkGrayPen = (HPEN)CreatePen(
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
PS_SOLID,1,RGB(128,128,128));
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
LightGrayPen= (HPEN)CreatePen(
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
PS_SOLID,1,RGB(192,192,192));
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
WhitePen = (HPEN)GetStockObject(WHITE_PEN);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
BlackPen = (HPEN)GetStockObject(BLACK_PEN);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
LightGrayBrush = (HBRUSH)GetStockObject( LTGRAY_BRUSH);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
NullBrush = (HBRUSH)GetStockObject(
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
NULL_BRUSH);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
LOGBRUSH lb;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
lb.lbStyle = BS_SOLID;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
lb.lbColor = RGB( 0, 0, 128);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
lb.lbHatch = NULL;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
BlueBrush = CreateBrushIndirect(&lb);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
void TNewDialog::WMActivate(RTMessage Msg)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if(Msg.WParam==WA_ACTIVE ||
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Msg.WParam==WA_CLICKACTIVE)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DrawFrame();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
void TNewDialog::WMNCPaint(RTMessage )
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{ DrawFrame(); }
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
void TNewDialog::DrawFrame()
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
RECT rWinRect;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
HDC hWinDC;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
LONG DLGStyle;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
HPEN oldPen;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
HBRUSH oldBrush;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int r,b;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
hWinDC = GetWindowDC(HWindow);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
G etWindowRect(HWindow,&rWinRect);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
r = rWinRect.right-rWinRect.left-1;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
b = rWinRect.bottom-rWinRect.top-1;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
oldPen = (HPEN)SelectObject(
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
hWinDC,DarkGrayPen);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
oldBrush=(HBRUSH)SelectObject(
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
hWinDC,NullBrush);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Rectangle(hWinDC,0,0,r,b);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SelectObject(hWinDC,BlueBrush);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Rectangle(hWinDC,5,4,r-4,24);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SelectObject(hWinDC,BlackPen);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
MoveTo(hWinDC,0,b);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
LineTo(hWinDC,r,b);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
LineTo(hWinDC,r,-1);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SelectObject(hWinDC,WhitePen);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
MoveTo(hWinDC,1,b-2);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
LineTo(hWinDC,1,1);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
LineTo(hWinDC,r-1,1);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
MoveTo(hWinDC,r-5,5);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
LineTo(hWinDC,r-5,23);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
LineTo(hWinDC,4,23);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SelectObject(hWinDC,LightGrayPen);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SelectObject(hWinDC,NullBrush);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Rectangle(hWinDC,2,2,r-1,b-1);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Rectangle(hWinDC,3,3,r-2,b-2);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Rectangle(hWinDC,4,4,r-3,b-3);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SelectObject(hWinDC,DarkGrayPen);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
MoveTo(hWinDC,5,4);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
LineTo(hWinDC,r-4,4);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DLGStyle = GetWindowLong(HWindow,
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
GWL_STYLE);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(DLGStyle & WS_SYSMENU)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SelectObject(hWinDC,LightGrayPen);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SelectObject(hWinDC,LightGrayBrush);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Rectangle(hWinDC,6,5,24,23);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SelectObject(hWinDC,BlackPen);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SelectObject(hWinDC,NullBrush);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Rectangle(hWinDC,8,12,21,15);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SelectObject(hWinDC,WhitePen);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
MoveTo(hWinDC,9,13);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
LineTo(hWinDC,20,13);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SelectObject(hWinDC,DarkGrayPen);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
MoveTo(hWinDC,9,15);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
LineTo(hWinDC,21,15);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
LineTo(hWinDC,21,12);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SelectObject(hWinDC,oldPen);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SelectObject(hWinDC,oldBrush);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ReleaseDC(HWindow,hWinDC);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}