要使用 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。