02. Win32 API简介

我将复制DirectX 9中的创建窗口课程,因为它们是相同的。这里有很多代码可以入门,但是一旦完成,我们就可以开始实际使用DirectX。

我们的应用程序首先包含windows.h头文件。当创建一个窗口时,需要为该窗口创建一个Windows类,这就是下一行的用途。在下面,这只是我们窗口的句柄

#include <windows.h>

LPCTSTR WndClassName = “firstwindow”;
HWND hwnd
= NULL;

我们将使用这些常量定义窗口的宽度和高度

const int Width  = 800;
const int Height = 600;
InitializeWindow() 函数将执行其说明,然后根据是否创建窗口来返回true或false。然后,我们初始化消息循环函数,该函数使程序保持运行状态。我们将稍作讨论。
bool InitializeWindow(HINSTANCE hInstance,
         int ShowWnd,
         int width, int height,
         bool windowed);

int messageloop();

我们初始化Windows回调过程。Windows API是“事件驱动”的编程模型,因此在此功能中,我们可以“捕获” Windows消息,例如按键(也称为事件)并操纵程序的流程。

LRESULT CALLBACK WndProc(HWND hWnd,
         UINT msg,
         WPARAM wParam,
         LPARAM lParam);
我们需要一个主函数来启动我们的应用程序。在Windows编程中,该函数是 WinMain() 函数。
int WINAPI WinMain(HINSTANCE hInstance,    //Main windows function
       HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine,
       int nShowCmd)
{
我们在 WinMain() 函数中所做的第一件事是通过调用 InitializeWindow() 函数来创建并注册窗口。该函数将根据窗口是否注册和创建而返回true或false。窗口初始化之后,我们继续进行应用程序的交互部分。消息循环。 之后,我们进入消息循环。消息循环完成后,我们通过返回0结束程序,这意味着程序成功并且没有错误。
if(!InitializeWindow(hInstance, nShowCmd, Width, Height, true))
{
    MessageBox(0, "Window Initialization - Failed",
                "Error", MB_OK);
    return 0;
}
messageloop();
return 0;
}
我们的下一个功能是 InitializeWindow(hInstance,nShowCmd) 功能。这将创建并注册该类。 HINSTANCE hInstance- 这是我们当前应用程序的句柄
int ShowWnd - How the window should be displayed. Some common commands are SW_SHOWMAXIMIZED, SW_SHOW, SW_SHOWMINIMIZED.

int width - Width of the window in pixels

int height - Height of the window in pixels

bool windowed - False if the window is fullscreen and true if the window is windowed

bool InitializeWindow(HINSTANCE hInstance,
int ShowWnd,
int width, int height,
bool windowed)
{

我们创建一个名为wc的扩展样式的Windows类,然后填写所有属性。该WNDCLASSESEX结构如下所示:

typedef struct _WNDCLASS {
    UINT cbSize;
    UINT style;
    WNDPROC lpfnWndProc;
    int cbClsExtra;
    int cbWndExtra;
    HANDLE hInstance;
    HICON hIcon;
    HCURSOR hCursor;
    HBRUSH hbrBackground;
    LPCTSTR lpszMenuName;
    LPCTSTR lpszClassName;
} WNDCLASS;
WNDCLASSEX wc;
第一个是cbSize。应该将其设置为我们的窗口类的大小 sizeof(WNDCLASSEX)
wc.cbSize = sizeof(WNDCLASSEX);
style是Windows类的样式。它们都以 CS_ 开头。这里有些例子。 CS_CLASSDC 1 OK按钮 CS_DBLCLKS 在此类创建的所有窗口之间共享一个设备上下文。 CS_HREDRAW 启用在窗口上双击的功能。 CS_HREDRAW 如果窗口的宽度发生变化或水平移动窗口,则刷新窗口。 CS_NOCLOSE 禁用窗口菜单上的关闭选项。 CS_OWNDC 为创建的每个窗口创建一个唯一的设备上下文。这与CS_CLASSDC相反。 CS_PARENTDC 这将子窗口的剪切矩形设置为父窗口的剪切矩形。这使子窗口能够在父窗口上绘制。 CS_VREDRAW 如果窗口的高度发生变化或垂直移动窗口,则会重新绘制窗口。 欲了解更多课堂风格,请 点击此处 我们将设置为在窗口移动或更改大小时重新绘制
wc.style = CS_HREDRAW | CS_VREDRAW;
lpfnWndProc 是我们要处理Windows消息的函数的指针。之所以将其设置为WndProc,是因为这就是我们的Windows处理功能的名称。
wc.lpfnWndProc = WndProc;
cbClsExtraWNDCLASSEX 之后分配的额外字节数。
wc.cbClsExtra = NULL;
cbWndExtra 指定在Windows实例之后分配的字节数。
wc.cbWndExtra = NULL;
这是我们当前的Windows应用程序的句柄。所述 的GetModuleHandle() 函数可用于通过使空到其1个参数来获取当前窗口的应用程序。
wc.hInstance = hInstance;
hIcon用于在标题栏中指定窗口左上角的图标。以下是一些标准图标: IDI_APPLICATION 默认应用程序图标 IDI_HAND 手形图标 IDI_EXCLAMATION 感叹号图标 IDI_INFORMATION Asterix图标 IDI_QUESTION 问号图标 IDI_WINLOGO 如果使用XP,则为 默认应用程序图标,否则为Windows徽标。 有关图标的更多信息,请转到此处
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
这个定义了光标将要显示的图标。这里有一些: IDC_APPSTARTING 标准箭头和小的沙漏光标。 IDC_ARROW 标准箭头光标。 IDC_CROSS 十字线光标。 IDC_HAND 手形光标。 IDC_NO圆形光标 斜线。 IDC_WAIT 沙漏光标。 有关更多光标,请转到此处
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
hbrBackground 是画笔的句柄。这将使背景变黑。玩吧。
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 2);
这是附加到我们窗口的菜单的名称。我们没有一个,所以我们放 NULL
wc.lpszMenuName = NULL;
我们在这里为班级命名。
wc.lpszClassName = WndClassName;
这将指定任务栏中的图标。它使用与上面相同的 IDI_ 图标。
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
现在我们注册课程。如果失败,我们将得到一个错误。如果通过了,我们继续创建窗口。
if (!RegisterClassEx(&wc))
{
    MessageBox(NULL, "Error registering class",    
        "Error", MB_OK | MB_ICONERROR);
    return false;
}
这是我们创建窗口的部分!
hwnd = CreateWindowEx(
这是扩展样式。您可以通过添加|来添加多个。它们之间。这里一对: WS_EX_ACCEPTFILES以此 创建的窗口可以接受拖放文件。 WS_EX_APPWINDOW 当可见窗口时,将顶级窗口强制到任务栏上。 WS_EX_CONTEXTHELP 窗口右上方的帮助按钮。不能与WS_MAXIMIZEBOX或WS_MINIMIZEBOX样式一起使用。 WS_EX_TOOLWINDOW 创建旨在用作浮动工具栏的窗口。 有关扩展样式的完整列表,请单击此处。
    NULL,
这是我们的窗口将使用的类的名称。这是我们之前注册的课程。
    WndClassName,
这是将显示在标题栏中的文本。
    "Window Title",
这是旧的CreateWindow函数的样式。创建CreateWindowEX是为了允许将扩展样式应用于窗口。下面是一些样式。 WS_BORDER 创建一个带有细线边框的窗口。 WS_CAPTION 创建一个带有标题栏的窗口(包括WS_BORDER样式)。 WS_DISABLED 创建一个最初被禁用的窗口。禁用的窗口无法接收来自用户的输入。 WS_HSCROLL 创建一个具有水平滚动条的窗口。 WS_MAXIMIZE 创建一个最初被最大化的窗口。 WS_MAXIMIZEBOX 创建一个具有最大化按钮的窗口。 WS_MINIMIZE 创建一个最初最小化的窗口。 WS_MINIMIZEBOX 创建一个带有最小化按钮的窗口。 WS_POPUP 创建一个弹出窗口。 WS_SIZEBOX 创建一个具有尺寸边框的窗口。与WS_THICKFRAME样式相同。 WS_SYSMENU 创建一个在其标题栏上具有窗口菜单的窗口。 WS_VSCROLL 创建一个具有垂直滚动条的窗口。 WS_OVERLAPPEDWINDOW 创建具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX和WS_MAXIMIZEBOX样式的重叠窗口。 WS_OVERLAPPED 创建一个在其标题栏上具有窗口菜单的窗口。 WS_THICKFRAME 创建一个具有尺寸边框的窗口。与WS_SIZEBOX样式相同。 单击此处以获取更多窗口样式
    WS_OVERLAPPEDWINDOW,
开始X和Y位置。窗口的左上角。0,0是屏幕的左上方。
    CW_USEDEFAULT, CW_USEDEFAULT,
窗口的高度和宽度(以像素为单位)
    width, height,
处理到父窗口。我们没有父项,因此将其设置为 NULL
    NULL,
处理窗口附带的菜单。我们没有一个,因此再次将其设置为 NULL
    NULL,
当前程序的实例。
    hInstance,
如果我们的窗口是MDI客户端,则将使用它。我们不是,所以我们将其设置为 NULL 。之后,我们检查是否创建了窗口。
    NULL
    );
if (!hwnd)
{
    MessageBox(NULL, "Error creating window",
        "Error", MB_OK | MB_ICONERROR);
    return false;
}
我们需要显示窗口,这就是 ShowWindow() 函数的作用。这是 ShowWindow() 的语法。
BOOL ShowWindow( HWND hWnd, int nCmdShow );
第一个参数是我们想要显示的窗口的句柄,第二个参数是我们想要显示的窗口的方式,例如最大化或最小化。在显示窗口之后,我们应该使用 UpdateWindow() 刷新它。
BOOL UpdateWindow( HWND hWnd );
唯一的参数是我们显示的窗口的句柄。什么 UpdateWindow() 的作用是发送 WM_PAINT 直接消息到窗口过程。如果窗口的客户区域中没有任何内容,则 UpdateWindow() 不会发送消息。然后,我们返回true,以便 WinMain() 函数可以进入消息循环。
    ShowWindow(hwnd, ShowWnd);
    UpdateWindow(hwnd);

return true;
}

完成初始化窗口后,我们可以继续执行程序的主要部分,即消息循环。这是使程序继续运行的原因。

int messageloop(){
我们要做的第一件事是为 MSG 结构创建一个实例,该实例是Windows消息的结构。这将保存消息的信息。
MSG msg;
ZeroMemory() 清除结构并将其设置为 NULL 。它有两个参数。第一个是要清除的结构的指针,第二个是要清除的结构的大小。
ZeroMemory(&msg, sizeof(MSG));
当有消息时...
while(true)
{
我们使用 PeekMessage() 来查看是否有消息。有五个参数:
BOOL PeekMessage(      
    LPMSG lpMsg,
    HWND hWnd,
    UINT wMsgFilterMin,
    UINT wMsgFilterMax,
    UINT wRemoveMsg
);
LPMSG lpMsg-这是我们消息结构的指针 HWND hWnd-这是发送消息的窗口的句柄。如果将其设置为null,它将从当前程序的任何窗口中获取消息。 UINT wMsgFilterMin-指定要检查的消息范围内的第一条消息的值。如果wMsgFilterMin和wMsgFilterMax都设置为零,则PeekMessage将检查所有消息。 UINT wMsgFilterMax-指定要检查的消息范围内的最后一条消息的值。 UINT wRemoveMsg-指定如何处理消息。我们将其设置为PM_REMOVE,以便在阅读消息后将其删除。 有关 PeekMessage()的 更多信息,请转到此处
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
如果该消息是退出消息,则关闭程序。
if (msg.message == WM_QUIT)
    break;
如果我们的消息是Windows消息,则我们先翻译然后发送。 TranslateMessage() 将使窗口执行某些转换,例如将键盘的虚拟键转换为字符。将 在DispatchMessage() 将消息发送到我们的windows程序, WndProc的 。之后,我们返回消息。
            TranslateMessage(&msg);    
            DispatchMessage(&msg);
        }
如果没有Windows消息,则运行我们的游戏。

    else{
        // run game code
        }
    }
return msg.wParam;
}
终于到了尽头。我们现在正在使用Windows消息处理功能。 HWND hwnd 是获取消息的窗口的句柄。 UINT msg 是消息的内容。这是一对。 WM_ACTIVATE 激活窗口时发送的消息。 WM_CLOSE 关闭窗口时发送的消息。 WM_CREATE 创建窗口时发送的消息。 WM_DESTROY 销毁窗口时发送的消息。 这是指向更多Windows消息的几个链接。 窗口消息 键盘讯息 wParam和lParam是有关该消息的其他信息。我们将使用wParam来检测键盘输入。
LRESULT CALLBACK WndProc(HWND hwnd,
             UINT msg,
             WPARAM wParam,
             LPARAM lParam)
{
这是我们检查消息是否发生事件的地方。如果按下了退出键,我们将显示一个消息框,询问您是否真的要退出。如果单击是,程序将关闭。如果未命中,则消息框将关闭。如果消息包含 WM_DESTROY ,则意味着该窗口已被破坏,我们返回0并关闭应用程序。
switch( msg )
{
</span><span class="kwd">case</span><span class="pln"> WM_KEYDOWN</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln"> wParam </span><span class="pun">==</span><span class="pln"> VK_ESCAPE </span><span class="pun">){</span><span class="pln">
        </span><span class="kwd">if</span><span class="pun">(</span><span class="typ">MessageBox</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Are you sure you want to exit?"</span><span class="pun">,</span><span class="pln">
                </span><span class="str">"Really?"</span><span class="pun">,</span><span class="pln"> MB_YESNO </span><span class="pun">|</span><span class="pln"> MB_ICONQUESTION</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> IDYES</span><span class="pun">)</span><span class="pln">
        </span><span class="typ">DestroyWindow</span><span class="pun">(</span><span class="pln">hwnd</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">case</span><span class="pln"> WM_DESTROY</span><span class="pun">:</span><span class="pln">
    </span><span class="typ">PostQuitMessage</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

}

最后,我们调用DefWindowProc函数。这是默认的Windows过程功能。最后,我们称其为照顾我们收到的所有消息,但不照顾自己。

    return DefWindowProc(hwnd,
             msg,
             wParam,
             lParam);
}
现在,我们终于结束了这一课。如果一切正确,没有错误,此程序应创建一个带有灰色背景的窗口。我们现在准备好玩有趣的东西,directX和opengl! 完整代码:
//Include necessary Headers//
#include <windows.h>

//Define variables/constants//
LPCTSTR
WndClassName = “firstwindow”; //Define our window class name
HWND hwnd
= NULL; //Sets our windows handle to NULL

const int Width = 800; //window width
const int Height = 600; //window height

//Functions//
bool InitializeWindow(HINSTANCE hInstance, //Initialize our window
int ShowWnd,
int width, int height,
bool windowed);

int messageloop(); //Main part of the program

LRESULT CALLBACK WndProc(HWND hWnd, //Windows callback procedure
UINT msg
,
WPARAM wParam
,
LPARAM lParam
);

int WINAPI WinMain(HINSTANCE hInstance, //Main windows function
HINSTANCE hPrevInstance
,
LPSTR lpCmdLine
,
int nShowCmd)
{
//Initialize Window//
if(!InitializeWindow(hInstance, nShowCmd, Width, Height, true))
{
//If initialization failed, display an error message
MessageBox(0, “Window Initialization - Failed”,
“Error”, MB_OK);
return 0;
}

messageloop</span><span class="pun">();</span><span class="pln">    </span><span class="com">//Jump into the heart of our program</span><span class="pln">

</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

}

bool InitializeWindow(HINSTANCE hInstance, //Initialize our window
int ShowWnd,
int width, int height,
bool windowed)
{
//Start creating the window//

WNDCLASSEX wc</span><span class="pun">;</span><span class="pln">    </span><span class="com">//Create a new extended windows class</span><span class="pln">

wc</span><span class="pun">.</span><span class="pln">cbSize </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">WNDCLASSEX</span><span class="pun">);</span><span class="pln">    </span><span class="com">//Size of our windows class</span><span class="pln">
wc</span><span class="pun">.</span><span class="pln">style </span><span class="pun">=</span><span class="pln"> CS_HREDRAW </span><span class="pun">|</span><span class="pln"> CS_VREDRAW</span><span class="pun">;</span><span class="pln">    </span><span class="com">//class styles</span><span class="pln">
wc</span><span class="pun">.</span><span class="pln">lpfnWndProc </span><span class="pun">=</span><span class="pln"> </span><span class="typ">WndProc</span><span class="pun">;</span><span class="pln">    </span><span class="com">//Default windows procedure function</span><span class="pln">
wc</span><span class="pun">.</span><span class="pln">cbClsExtra </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">    </span><span class="com">//Extra bytes after our wc structure</span><span class="pln">
wc</span><span class="pun">.</span><span class="pln">cbWndExtra </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">    </span><span class="com">//Extra bytes after our windows instance</span><span class="pln">
wc</span><span class="pun">.</span><span class="pln">hInstance </span><span class="pun">=</span><span class="pln"> hInstance</span><span class="pun">;</span><span class="pln">    </span><span class="com">//Instance to current application</span><span class="pln">
wc</span><span class="pun">.</span><span class="pln">hIcon </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LoadIcon</span><span class="pun">(</span><span class="pln">NULL</span><span class="pun">,</span><span class="pln"> IDI_WINLOGO</span><span class="pun">);</span><span class="pln">    </span><span class="com">//Title bar Icon</span><span class="pln">
wc</span><span class="pun">.</span><span class="pln">hCursor </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LoadCursor</span><span class="pun">(</span><span class="pln">NULL</span><span class="pun">,</span><span class="pln"> IDC_ARROW</span><span class="pun">);</span><span class="pln">    </span><span class="com">//Default mouse Icon</span><span class="pln">
wc</span><span class="pun">.</span><span class="pln">hbrBackground </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">HBRUSH</span><span class="pun">)(</span><span class="pln">COLOR_WINDOW </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">    </span><span class="com">//Window bg color</span><span class="pln">
wc</span><span class="pun">.</span><span class="pln">lpszMenuName </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">    </span><span class="com">//Name of the menu attached to our window</span><span class="pln">
wc</span><span class="pun">.</span><span class="pln">lpszClassName </span><span class="pun">=</span><span class="pln"> </span><span class="typ">WndClassName</span><span class="pun">;</span><span class="pln">    </span><span class="com">//Name of our windows class</span><span class="pln">
wc</span><span class="pun">.</span><span class="pln">hIconSm </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LoadIcon</span><span class="pun">(</span><span class="pln">NULL</span><span class="pun">,</span><span class="pln"> IDI_WINLOGO</span><span class="pun">);</span><span class="pln"> </span><span class="com">//Icon in your taskbar</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="typ">RegisterClassEx</span><span class="pun">(&amp;</span><span class="pln">wc</span><span class="pun">))</span><span class="pln">    </span><span class="com">//Register our windows class</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
        </span><span class="com">//if registration failed, display error</span><span class="pln">
    </span><span class="typ">MessageBox</span><span class="pun">(</span><span class="pln">NULL</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Error registering class"</span><span class="pun">,</span><span class="pln">    
        </span><span class="str">"Error"</span><span class="pun">,</span><span class="pln"> MB_OK </span><span class="pun">|</span><span class="pln"> MB_ICONERROR</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

hwnd </span><span class="pun">=</span><span class="pln"> </span><span class="typ">CreateWindowEx</span><span class="pun">(</span><span class="pln">    </span><span class="com">//Create our Extended Window</span><span class="pln">
    NULL</span><span class="pun">,</span><span class="pln">    </span><span class="com">//Extended style</span><span class="pln">
    </span><span class="typ">WndClassName</span><span class="pun">,</span><span class="pln">    </span><span class="com">//Name of our windows class</span><span class="pln">
    </span><span class="str">"Window Title"</span><span class="pun">,</span><span class="pln">    </span><span class="com">//Name in the title bar of our window</span><span class="pln">
    WS_OVERLAPPEDWINDOW</span><span class="pun">,</span><span class="pln">    </span><span class="com">//style of our window</span><span class="pln">
    CW_USEDEFAULT</span><span class="pun">,</span><span class="pln"> CW_USEDEFAULT</span><span class="pun">,</span><span class="pln">    </span><span class="com">//Top left corner of window</span><span class="pln">
    width</span><span class="pun">,</span><span class="pln">    </span><span class="com">//Width of our window</span><span class="pln">
    height</span><span class="pun">,</span><span class="pln">    </span><span class="com">//Height of our window</span><span class="pln">
    NULL</span><span class="pun">,</span><span class="pln">    </span><span class="com">//Handle to parent window</span><span class="pln">
    NULL</span><span class="pun">,</span><span class="pln">    </span><span class="com">//Handle to a Menu</span><span class="pln">
    hInstance</span><span class="pun">,</span><span class="pln">    </span><span class="com">//Specifies instance of current program</span><span class="pln">
    NULL    </span><span class="com">//used for an MDI client window</span><span class="pln">
    </span><span class="pun">);</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">hwnd</span><span class="pun">)</span><span class="pln">    </span><span class="com">//Make sure our window has been created</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">//If not, display error</span><span class="pln">
    </span><span class="typ">MessageBox</span><span class="pun">(</span><span class="pln">NULL</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Error creating window"</span><span class="pun">,</span><span class="pln">
        </span><span class="str">"Error"</span><span class="pun">,</span><span class="pln"> MB_OK </span><span class="pun">|</span><span class="pln"> MB_ICONERROR</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">ShowWindow</span><span class="pun">(</span><span class="pln">hwnd</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ShowWnd</span><span class="pun">);</span><span class="pln">    </span><span class="com">//Shows our window</span><span class="pln">
</span><span class="typ">UpdateWindow</span><span class="pun">(</span><span class="pln">hwnd</span><span class="pun">);</span><span class="pln">    </span><span class="com">//Its good to update our window</span><span class="pln">

</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">    </span><span class="com">//if there were no errors, return true</span><span class="pln">

}

int messageloop(){ //The message loop

MSG msg</span><span class="pun">;</span><span class="pln">    </span><span class="com">//Create a new message structure</span><span class="pln">
</span><span class="typ">ZeroMemory</span><span class="pun">(&amp;</span><span class="pln">msg</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">MSG</span><span class="pun">));</span><span class="pln">    </span><span class="com">//clear message structure to NULL</span><span class="pln">

</span><span class="kwd">while</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln">    </span><span class="com">//while there is a message</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
      </span><span class="com">//if there was a windows message</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">PeekMessage</span><span class="pun">(&amp;</span><span class="pln">msg</span><span class="pun">,</span><span class="pln"> NULL</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> PM_REMOVE</span><span class="pun">))</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">msg</span><span class="pun">.</span><span class="pln">message </span><span class="pun">==</span><span class="pln"> WM_QUIT</span><span class="pun">)</span><span class="pln">    </span><span class="com">//if the message was WM_QUIT</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">    </span><span class="com">//Exit the message loop</span><span class="pln">

        </span><span class="typ">TranslateMessage</span><span class="pun">(&amp;</span><span class="pln">msg</span><span class="pun">);</span><span class="pln">    </span><span class="com">//Translate the message</span><span class="pln">
        
        </span><span class="com">//Send the message to default windows procedure</span><span class="pln">
        </span><span class="typ">DispatchMessage</span><span class="pun">(&amp;</span><span class="pln">msg</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">else</span><span class="pun">{</span><span class="pln">    </span><span class="com">//Otherewise, keep the flow going</span><span class="pln">

    </span><span class="pun">}</span><span class="pln">
    

</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">msg</span><span class="pun">.</span><span class="pln">wParam</span><span class="pun">;</span><span class="pln">        </span><span class="com">//return the message</span><span class="pln">

}

LRESULT CALLBACK WndProc(HWND hwnd, //Default windows procedure
UINT msg
,
WPARAM wParam
,
LPARAM lParam
)
{
switch( msg ) //Check message
{

</span><span class="kwd">case</span><span class="pln"> WM_KEYDOWN</span><span class="pun">:</span><span class="pln">    </span><span class="com">//For a key down</span><span class="pln">
       </span><span class="com">//if escape key was pressed, display popup box</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln"> wParam </span><span class="pun">==</span><span class="pln"> VK_ESCAPE </span><span class="pun">){</span><span class="pln">
        </span><span class="kwd">if</span><span class="pun">(</span><span class="typ">MessageBox</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Are you sure you want to exit?"</span><span class="pun">,</span><span class="pln">
               </span><span class="str">"Really?"</span><span class="pun">,</span><span class="pln"> MB_YESNO </span><span class="pun">|</span><span class="pln"> MB_ICONQUESTION</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> IDYES</span><span class="pun">)</span><span class="pln">
                
               </span><span class="com">//Release the windows allocated memory  </span><span class="pln">
            </span><span class="typ">DestroyWindow</span><span class="pun">(</span><span class="pln">hwnd</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">case</span><span class="pln"> WM_DESTROY</span><span class="pun">:</span><span class="pln">    </span><span class="com">//if x button in top right was pressed</span><span class="pln">
    </span><span class="typ">PostQuitMessage</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

}
//return the message for windows to handle it
return DefWindowProc(hwnd,
msg
,
wParam
,
lParam
);
}


我几乎忘了,如果您遇到这样的错误;
错误C2664:“ MessageBoxW”:无法将参数2从“ const char [6]”转换为“ LPCWSTR”
然后在顶部转到项目,设置属性…(或仅按ALT + F7),然后在左侧展开配置属性,然后单击“常规”。在右侧的底部显示字符集,将其从Unicode更改为Multi-Byte。

我忘记提及的另一件事是,如果您想使用国际字符(例如中文),请不要将字符集更改为多字节。保持原样,并在代码中的每个字符串之前加上大写字母“ L”。
一个例子是:
“你确定要离开?” —> L“确定要退出吗?”
您将必须记住始终在每个字符串前放置一个“ L”。另外,您可能必须将PeekMessage更改为PeekMessageL

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

szmtjs10

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值