CreateWindow

// 包含头文件windows.h
#include <windows.h>
#include "tchar.h"

// 预先声明Message Handler,可以叫做任何名字,这里是MyWindowProcedure
LRESULT CALLBACK MyWindowProcedure(HWND, UINT, WPARAM, LPARAM);

// 以下是所有Windows程序都需要的WinMain函数
// WinMain主要用来实现三个功能:
// 1. 注册Window Class;
// 2. 在内存中创建Window并初始化Window的属性;
// 3. 创建一个Message Loop来检查Message Queue中有没有该Window的Message。

//nCmdShow:指明窗口如何显示
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpszCmdLine,int nCmdShow)
{
 wchar_t *szAppName = _T("WinHello"); // 定义一个字符串
 HWND hwnd; // 定义一个Window Handle变量
 MSG msg; // 定义一个Message结构的变量,用来储存Message的信息

 WNDCLASS wc; // 定义一个Window Class数据结构,用来储存Window Class的属性

 //下面这段代码用来定义Window的属性,例如Message Handler的地址、窗口背景、光标和图标等
 wc.style=CS_HREDRAW|CS_VREDRAW; // 设置style: 当窗口改变大小时就重新绘制窗口
 wc.lpfnWndProc=(WNDPROC)MyWindowProcedure; // 设定Window Procedure
 wc.cbClsExtra=0; // 用来储存Class Structure后的额外的数据,这里不需要
 wc.cbWndExtra=0; // 用来储存Window Instance后的额外的数据,这里不需要
 wc.hInstance=hInstance; // Window Procedure所在的Instance
 wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); // class的图标
 wc.hCursor=LoadCursor(NULL,IDC_ARROW); // class的光标
 wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); // 背景刷
 wc.lpszMenuName=NULL; // 菜单资源的名字,这里没有
 wc.lpszClassName=szAppName; // 应用程序的名字

 // 注册Window,通过调用API函数RegisterClass来实现
 // 注册Window Class的一个目的就是将Window和Window Procedure关联起来
 RegisterClass(&wc);

 // 注册Window Class后,WinMain就调用CreateWindow函数来创建应用程序的Window
 hwnd = CreateWindow(szAppName, // 已注册的Class名字
      L"Hello, World – Windows_98 Style", // Window名字(标题)
      WS_OVERLAPPEDWINDOW, // Window风格
      CW_USEDEFAULT, // Window起点的X坐标
      CW_USEDEFAULT, // Window起点的Y坐标
      CW_USEDEFAULT, // Window的宽度
      CW_USEDEFAULT, // Window的高度
      HWND_DESKTOP, // 父窗口的handle
      NULL, // 菜单的handle
      hInstance, // 应用程序instance的handle
      NULL // window-creation数据的指针
      );

 // 以下两条语句用来显示Window
 ShowWindow(hwnd, nCmdShow);
 UpdateWindow(hwnd);

 // 用while循环语句来检索并发送Messages
 // 从Message Queue中检索Message,并将它放到变量msg中。
 // 当收到"WM_QUIT"这个Message时,GetMessage函数就返回0,循环结束。而且WinMain函数也结束,程序终止。
 while(GetMessage(&msg, NULL, 0, 0))
 {
  //函数功能:该函数将虚拟键消息转换为字符消息。字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或PeekMessage时被读出。
  TranslateMessage(&msg); // 将Virtual-Key Messages转化为Character Messages

  //该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。
  DispatchMessage(&msg); // 将Message发送到Window Procedure
 }

 return (int)msg.wParam;
}

/* 操作系统向应用程序发送一系列消息,如左键按下和左键抬起,应用程序将通过GetMessage等方法最终将消息提交到窗口过程 */
// MyWindowProcedure函数处理WM_PAINT和WM_DESTROY这两个Message,然后必须调用DefWindowProc去处理其他Message
LRESULT CALLBACK MyWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 PAINTSTRUCT ps; // 定义一个PAINTSTRUCT结构的变量,用来储存绘制Window的Client Area的信息
 HDC hdc; // 定义一个HDC变量
 LPCTSTR text=L"Welcome to windows!"; // 定义一个LPCTSTR类型的字符串指针

 // 用switch语句来处理WM_PAINT和WM_DESTROY这两个Message
 switch(message)
 {
 case WM_PAINT:
  // 下面5条语句是用来在屏幕上输出文字的,我们在后面的章节会详细讨论这个问题的,这里就不多说了

  /*
    BeginPaint函数准备指定的窗口来重绘并将绘画相关的信息放到一个PAINTSTRUCT结构中。
    HDC BeginPaint(HWND hwnd, // 窗口的HANDLE
              LPPAINTSTRUCT lpPaint // 绘画信息
             );
  */
  hdc = BeginPaint(hwnd, &ps);
  RECT rect;
  GetClientRect(hwnd, &rect);
  TextOut(hdc, (rect.right-rect.left)/2, (rect.bottom-rect.top)/2, text, lstrlen(text));//该函数用当前选择字符、背景颜色和正文颜色将一个字符串写到指定位置。
  EndPaint(hwnd, &ps);

  return 0;

  // 处理退出消息
 case WM_DESTROY:
  /*
     函数功能:该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息。
     函数原型:VOID PostQuitMessage(int nExitCode);
     参数: pExitCode:指定应用程序退出代码。此值被用作消息WM_QUIT的wParam参数
  */
  PostQuitMessage(0);

  return 0;
 }

 // 调用默认的Window Procedure,使所有Message都可以被处理
 return DefWindowProc(hwnd, message, wParam, lParam);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的 Win32 API 程序,它演示了如何创建一个窗口,并在窗口中显示文本: ```c++ #include <windows.h> // 窗口过程 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); // 绘制文本 TextOut(hdc, 10, 10, "Hello, world!", 13); EndPaint(hwnd, &ps); } return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } // 程序入口点 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 注册窗口类 WNDCLASS wc = { 0 }; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.lpszClassName = "MyWindowClass"; RegisterClass(&wc); // 创建窗口 HWND hwnd = CreateWindow( "MyWindowClass", "My Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if (hwnd == NULL) { MessageBox(NULL, "Failed to create window", "Error", MB_OK | MB_ICONERROR); return 1; } // 显示窗口 ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // 消息循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } ``` 这个程序使用了 Win32 API 来创建一个窗口,并在窗口中显示了文本。在程序入口点 `WinMain` 中,首先注册了一个窗口类,然后创建了一个窗口,并显示出来。接着进入消息循环,等待消息的到来,然后处理消息。在窗口过程 `WindowProc` 中,处理了窗口销毁和绘制消息。在绘制消息中,使用了 `TextOut` 函数来绘制文本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

OneOnce

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

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

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

打赏作者

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

抵扣说明:

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

余额充值