导航:  CWindow Class > Tutorial >

Creating the main window

上一页返回章节概述下一页

要使用 CWindow 您必须首先包含 "CWindow.inc" ,并允许访问其命名空间的所有符号 USING Afx.

 

#INCLUDE ONCE "CWindow.inc"

USING Afx

 

第一步是创建一个类的实例:

 

DIM pWindow AS CWindow

 

CWindow 构造函数为名称为“FBWindowClass:xxx”的窗口注册一个类,其中xxx是一个计数器号。 或者,您可以通过指定自己的类名来强制使用。

 

DIM pWindow AS CWindow = "MyClassName"

 

构造函数还检查应用程序是否感知DPI,并计算缩放比例和默认字体名称和点大小(“Tahoma”,8 pt,适用于Windows XP及更低版本;“Segoe UI”,9 pt,适用于Windows 7及更高版本 “)。

 

您可以在创建窗口之前设置自己的DPI和/或字体来覆盖它,例如。

 

DIM pWindow AS CWindow

pWindow. DPI = 96

pWindow.SetFont(pWindow.SetFont("Times New Roman", 10, FW_NORMAL, , , , DEFAULT_CHARSET)

 

默认情况下,CWindow使用标准的 COLOR_3DFACE + 1 画笔。 您可以覆盖它调用Brush属性:

 

DIM pWindow AS CWindow

pWindow.Brush = GetStockObject(WHITE_BRUSH)

 

这使得窗口的背景变白。

 

窗口类使用CS_HREDRAW或CS_VREDRAW作为默认窗口样式。 没有它们,背景没有重画,控件在调整大小时会丢弃垃圾。 与他们,许多控件的窗户引起严重的闪烁。 为了避免闪烁,您可以使用例如更改窗口样式。 pWindow.ClassStyle = CS_DBLCLKS,并注意重新绘制。

 

下一步是创建窗口。

 

Create 方法有很多参数,所有参数都是可选的:

 

hParent     = Parent window handle

wszTitle    = Window caption

lpfnWndProc = Address of the callback function

x           = Horizontal position

y           = Vertical position

nWidth      = Window width

nHeight     = Window height

dwStyle     = Window style

dwExStyle   = Extended style

 

最简单的方法是:

 

DIM hwndMain AS HWND = pWindow.Create(NULL, "CWindow Test", @WndProc, 0, 0, 525, 395, _

 WS_OVERLAPPEDWINDOW OR WS_CLIPCHILDREN OR WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT OR WS_EX_WINDOWEDGE)

 

但只是使用

 

pWindow.Create

 

使用CW_USEDEFAULT创建和调整工作窗口。

 

除非窗口必须使用所有可用的桌面空间,我更喜欢使用 SetClientSize 方法来缩放窗口,因为Windows UI元素如标题和边框具有不同的大小,具体取决于Windows版本和/或所使用的样式。 因此,为了确保您有足够的空间让您的控件,根据客户端大小调整窗口是否足够。

 

我们可能需要处理Windows消息,所以我们需要提供一个回调函数,例如

 

' ========================================================================================

' 窗口过程

' ========================================================================================

FUNCTION WndProc (BYVAL hWnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT

 

 SELECT CASE uMsg

 

    CASE WM_COMMAND

       SELECT CASE LOWORD(wParam)

          CASE IDCANCEL

             ' // If ESC key pressed, close the application sending an WM_CLOSE message

             IF HIWORD(wParam) = BN_CLICKED THEN

                SendMessageW hwnd, WM_CLOSE, 0, 0

                EXIT FUNCTION

             END IF

       END SELECT

 

         CASE WM_DESTROY

       PostQuitMessage(0)

       EXIT FUNCTION

 

 END SELECT

 

 FUNCTION = DefWindowProcW(hWnd, uMsg, wParam, lParam)

 

END FUNCTION

' ========================================================================================

 

我们必须传递该回调函数的地址:

 

pWindow.Create(NULL, "CWindow Test", @WndProc)

pWindow.SetClientSize(500, 320)   ' 尺寸可以变化

 

或者,我们可以自动将窗口置于桌面中,调用Center 方法,例如.

 

pWindow.Create(NULL, "CWindow Test", @WndProc)

pWindow.SetClientSize(500, 320)   ' 尺寸可以变化

pWindow.Center

 

要处理Windows消息,我们需要一个消息泵。 CWindow 提供一个默认的调用 DoEvents 方法:

 

FUNCTION = pWindow.DoEvents(nCmdShow)

 

此默认消息泵显示窗口并处理消息。 它可以与大多数应用程序一起使用,但是在需要的情况下,您可以将其替换为您自己的应用程序。

 

' // 显示窗口

DIM hwndMain AS HWND = pWindow.hWindow

ShowWindow(hwndMain, nCmdShow)

UpdateWindow(hwndMain)

 

' // 处理Windows消息

DIM uMsg AS MSG

WHILE (GetMessageW(@uMsg, NULL, 0, 0) <> FALSE)

 IF IsDialogMessageW(hWndMain, @uMsg) = 0 THEN

    TranslateMessage(@uMsg)

    DispatchMessageW(@uMsg)

 END IF

WEND

FUNCTION = uMsg.wParam

 

每个实例的 CWindow 类有一个用户数据区域,包含99个LONG_PTR值的数组,可用于存储您发现有用的信息。

 

这些值是使用这些值进行设置和检索的 UserData 属性和索引从0到99。