zoukankan      html  css  js  c++  java
  • win32手动创建windows窗口的,小记

    摘抄自文档,其中的函数需要以后花时间看

     

    向 WinMain 添加功能

    1. 首先,在 WinMain 函数内部创建 WNDCLASSEX 类型的窗口类结构。 此结构包含有关窗口的信息,如应用程序图标、窗口的背景色、在标题栏中显示的名称、窗口过程函数的名称等等。典型的 WNDCLASSEX 结构如下:

          WNDCLASSEX wcex;
      
          wcex.cbSize = sizeof(WNDCLASSEX);
          wcex.style          = CS_HREDRAW | CS_VREDRAW;
          wcex.lpfnWndProc    = WndProc;
          wcex.cbClsExtra     = 0;
          wcex.cbWndExtra     = 0;
          wcex.hInstance      = hInstance;
          wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
          wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
          wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
          wcex.lpszMenuName   = NULL;
          wcex.lpszClassName  = szWindowClass;
          wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
      
          WNDCLASSEX wcex;
      
          wcex.cbSize = sizeof(WNDCLASSEX);
          wcex.style          = CS_HREDRAW | CS_VREDRAW;
          wcex.lpfnWndProc    = WndProc;
          wcex.cbClsExtra     = 0;
          wcex.cbWndExtra     = 0;
          wcex.hInstance      = hInstance;
          wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
          wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
          wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
          wcex.lpszMenuName   = NULL;
          wcex.lpszClassName  = szWindowClass;
          wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

      有关此结构的字段解释,请参见 WNDCLASSEX

    2. 现在已经创建了窗口类,接下来您必须注册它。使用 RegisterClassEx 函数,并将窗口类结构作为参数传递:

          if (!RegisterClassEx(&wcex))
          {
              MessageBox(NULL,
                  _T("Call to RegisterClassEx failed!"),
                  _T("Win32 Guided Tour"),
                  NULL);
      
              return 1;
          }
      
          if (!RegisterClassEx(&wcex))
          {
              MessageBox(NULL,
                  _T("Call to RegisterClassEx failed!"),
                  _T("Win32 Guided Tour"),
                  NULL);
      
              return 1;
          }
    3. 现在已经注册了您自己的类,接下来创建窗口。使用 CreateWindow 函数,如下所示:

      static TCHAR szWindowClass[] = _T("win32app");
      static TCHAR szTitle[] = _T("Win32 Guided Tour Application");
      // The parameters to CreateWindow explained:
      // szWindowClass: the name of the application
      // szTitle: the text that appears in the title bar
      // WS_OVERLAPPEDWINDOW: the type of window to create
      // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
      // 500, 100: initial size (width, length)
      // NULL: the parent of this window
      // NULL: this application dows not have a menu bar
      // hInstance: the first parameter from WinMain
      // NULL: not used in this application
      HWND hWnd = CreateWindow(
          szWindowClass,
          szTitle,
          WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, CW_USEDEFAULT,
          500, 100,
          NULL,
          NULL,
          hInstance,
          NULL
      );
      if (!hWnd)
      {
          MessageBox(NULL,
              _T("Call to CreateWindow failed!"),
              _T("Win32 Guided Tour"),
              NULL);
      
          return 1;
      }
      
      static TCHAR szWindowClass[] = _T("win32app");
      static TCHAR szTitle[] = _T("Win32 Guided Tour Application");
      // The parameters to CreateWindow explained:
      // szWindowClass: the name of the application
      // szTitle: the text that appears in the title bar
      // WS_OVERLAPPEDWINDOW: the type of window to create
      // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
      // 500, 100: initial size (width, length)
      // NULL: the parent of this window
      // NULL: this application dows not have a menu bar
      // hInstance: the first parameter from WinMain
      // NULL: not used in this application
      HWND hWnd = CreateWindow(
          szWindowClass,
          szTitle,
          WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, CW_USEDEFAULT,
          500, 100,
          NULL,
          NULL,
          hInstance,
          NULL
      );
      if (!hWnd)
      {
          MessageBox(NULL,
              _T("Call to CreateWindow failed!"),
              _T("Win32 Guided Tour"),
              NULL);
      
          return 1;
      }

      此函数返回 HWND,它是某个窗口的句柄。有关更多信息,请参见 Windows 数据类型

    4. 创建了窗口后,我们可以使用以下代码将其显示在屏幕上:

      // The parameters to ShowWindow explained:
      // hWnd: the value returned from CreateWindow
      // nCmdShow: the fourth parameter from WinMain
      ShowWindow(hWnd,
          nCmdShow);
      UpdateWindow(hWnd);
      
      // The parameters to ShowWindow explained:
      // hWnd: the value returned from CreateWindow
      // nCmdShow: the fourth parameter from WinMain
      ShowWindow(hWnd,
          nCmdShow);
      UpdateWindow(hWnd);

      到目前为止,此窗口还不会显示,因为我们尚未实现 WndProc 函数。

    5. WinMain 的最后一步是消息循环。 此循环的用途是侦听操作系统发送的消息。应用程序收到消息后,将该消息调度到 WndProc 函数,以便进行处理。 消息循环类似于:

       
      以带有颜色区分的格式查看复制到剪贴板打印
          MSG msg;
          while (GetMessage(&msg, NULL, 0, 0))
          {
              TranslateMessage(&msg);
              DispatchMessage(&msg);
          }
      
          return (int) msg.wParam;
      
          MSG msg;
          while (GetMessage(&msg, NULL, 0, 0))
          {
              TranslateMessage(&msg);
              DispatchMessage(&msg);
          }
      
          return (int) msg.wParam;

      有关消息循环中使用的结构和函数的更多信息,请参见 MSGGetMessageTranslateMessageDispatchMessage

      您刚才完成的步骤为大多数 Win32 应用程序所共用。有关此应用程序所需要的 include 指令和全局变量声明,请参见本主题末尾的完整代码 示例

      此时, WinMain 函数应该与下面的内容类似:

      int WINAPI WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpCmdLine,
                         int nCmdShow)
      {
          WNDCLASSEX wcex;
      
          wcex.cbSize = sizeof(WNDCLASSEX);
          wcex.style          = CS_HREDRAW | CS_VREDRAW;
          wcex.lpfnWndProc    = WndProc;
          wcex.cbClsExtra     = 0;
          wcex.cbWndExtra     = 0;
          wcex.hInstance      = hInstance;
          wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
          wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
          wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
          wcex.lpszMenuName   = NULL;
          wcex.lpszClassName  = szWindowClass;
          wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
      
          if (!RegisterClassEx(&wcex))
          {
              MessageBox(NULL,
                  _T("Call to RegisterClassEx failed!"),
                  _T("Win32 Guided Tour"),
                  NULL);
      
              return 1;
          }
      
          hInst = hInstance; // Store instance handle in our global variable
      
          // The parameters to CreateWindow explained:
          // szWindowClass: the name of the application
          // szTitle: the text that appears in the title bar
          // WS_OVERLAPPEDWINDOW: the type of window to create
          // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
          // 500, 100: initial size (width, length)
          // NULL: the parent of this window
          // NULL: this application dows not have a menu bar
          // hInstance: the first parameter from WinMain
          // NULL: not used in this application
          HWND hWnd = CreateWindow(
              szWindowClass,
              szTitle,
              WS_OVERLAPPEDWINDOW,
              CW_USEDEFAULT, CW_USEDEFAULT,
              500, 100,
              NULL,
              NULL,
              hInstance,
              NULL
          );
      
          if (!hWnd)
          {
              MessageBox(NULL,
                  _T("Call to CreateWindow failed!"),
                  _T("Win32 Guided Tour"),
                  NULL);
      
              return 1;
          }
      
          // The parameters to ShowWindow explained:
          // hWnd: the value returned from CreateWindow
          // nCmdShow: the fourth parameter from WinMain
          ShowWindow(hWnd,
              nCmdShow);
          UpdateWindow(hWnd);
      
          // Main message loop:
          MSG msg;
          while (GetMessage(&msg, NULL, 0, 0))
          {
              TranslateMessage(&msg);
              DispatchMessage(&msg);
          }
      
          return (int) msg.wParam;
      }
      
      int WINAPI WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpCmdLine,
                         int nCmdShow)
      {
          WNDCLASSEX wcex;
      
          wcex.cbSize = sizeof(WNDCLASSEX);
          wcex.style          = CS_HREDRAW | CS_VREDRAW;
          wcex.lpfnWndProc    = WndProc;
          wcex.cbClsExtra     = 0;
          wcex.cbWndExtra     = 0;
          wcex.hInstance      = hInstance;
          wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
          wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
          wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
          wcex.lpszMenuName   = NULL;
          wcex.lpszClassName  = szWindowClass;
          wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
      
          if (!RegisterClassEx(&wcex))
          {
              MessageBox(NULL,
                  _T("Call to RegisterClassEx failed!"),
                  _T("Win32 Guided Tour"),
                  NULL);
      
              return 1;
          }
      
          hInst = hInstance; // Store instance handle in our global variable
      
          // The parameters to CreateWindow explained:
          // szWindowClass: the name of the application
          // szTitle: the text that appears in the title bar
          // WS_OVERLAPPEDWINDOW: the type of window to create
          // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
          // 500, 100: initial size (width, length)
          // NULL: the parent of this window
          // NULL: this application dows not have a menu bar
          // hInstance: the first parameter from WinMain
          // NULL: not used in this application
          HWND hWnd = CreateWindow(
              szWindowClass,
              szTitle,
              WS_OVERLAPPEDWINDOW,
              CW_USEDEFAULT, CW_USEDEFAULT,
              500, 100,
              NULL,
              NULL,
              hInstance,
              NULL
          );
      
          if (!hWnd)
          {
              MessageBox(NULL,
                  _T("Call to CreateWindow failed!"),
                  _T("Win32 Guided Tour"),
                  NULL);
      
              return 1;
          }
      
          // The parameters to ShowWindow explained:
          // hWnd: the value returned from CreateWindow
          // nCmdShow: the fourth parameter from WinMain
          ShowWindow(hWnd,
              nCmdShow);
          UpdateWindow(hWnd);
      
          // Main message loop:
          MSG msg;
          while (GetMessage(&msg, NULL, 0, 0))
          {
              TranslateMessage(&msg);
              DispatchMessage(&msg);
          }
      
          return (int) msg.wParam;
      }

    向 WndProc 添加功能

    1. WndProc 函数的用途是处理应用程序接收的消息。 通常使用 Switch 函数实现此操作。

      我们将处理的第一个消息是 WM_PAINT 消息。 当必须更新应用程序窗口的一部分时,应用程序会收到此消息。首次创建窗口时,必须更新整个窗口,并传递此消息以指示此操作。

      当处理 WM_PAINT 消息时,首先应做的是调用 BeginPaint,最后应做的是调用 EndPaint。 在这两个函数调用之间,您可以处理所有的逻辑,以在窗口中排列文本、按钮和其他控件。对于此应用程序,我们在窗口中显示字符串“Hello, World!”。若要显示文本,请使用 TextOut 函数,也可以使用drawtext函数如下所示:

      PAINTSTRUCT ps;
      HDC hdc;
      TCHAR greeting[] = _T("Hello, World!");
      
      switch (message)
      {
      case WM_PAINT:
          hdc = BeginPaint(hWnd, &ps);
      
          // Here your application is laid out.// For this introduction, we just print out "Hello, World!"
          // in the top left corner.TextOut(hdc,
              5, 5,
              greeting, _tcslen(greeting));
          // End application-specific layout section.EndPaint(hWnd, &ps);
          break;
      }
      
      PAINTSTRUCT ps;
      HDC hdc;
      TCHAR greeting[] = _T("Hello, World!");
      
      switch (message)
      {
      case WM_PAINT:
          hdc = BeginPaint(hWnd, &ps);
      
          // Here your application is laid out.// For this introduction, we just print out "Hello, World!"
          // in the top left corner.TextOut(hdc,
              5, 5,
              greeting, _tcslen(greeting));
          // End application-specific layout section.EndPaint(hWnd, &ps);
          break;
      }
    2. 应用程序通常会处理许多其他消息,如 WM_CREATEWM_DESTROY。 一个简单而完整的 WndProc 函数如下:

      LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
      {
          PAINTSTRUCT ps;
          HDC hdc;
          TCHAR greeting[] = _T("Hello, World!");
      
          switch (message)
          {
          case WM_PAINT:
              hdc = BeginPaint(hWnd, &ps);
      
              // Here your application is laid out.// For this introduction, we just print out "Hello, World!"
              // in the top left corner.TextOut(hdc,
                  5, 5,
                  greeting, _tcslen(greeting));
              // End application specific layout section.EndPaint(hWnd, &ps);
              break;
          case WM_DESTROY:
              PostQuitMessage(0);
              break;
          default:
              return DefWindowProc(hWnd, message, wParam, lParam);
              break;
          }
      
          return 0;
      }


      完整代码

      #include <windows.h>
      #include <stdlib.h>
      #include <string.h>
      #include <tchar.h>

      // Global variables

      // The main window class name.static TCHAR szWindowClass[] = _T("win32app");

      // The string that appears in the application's title bar.static TCHAR szTitle[] = _T("Win32 Guided Tour Application");

      HINSTANCE hInst;

      // Forward declarations of functions included in this code module:
      LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

      int WINAPI WinMain(HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      LPSTR lpCmdLine,
      int nCmdShow)
      {
      WNDCLASSEX wcex;

      wcex.cbSize = sizeof(WNDCLASSEX);
      wcex.style = CS_HREDRAW | CS_VREDRAW;
      wcex.lpfnWndProc = WndProc;
      wcex.cbClsExtra = 0;
      wcex.cbWndExtra = 0;
      wcex.hInstance = hInstance;
      wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
      wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
      wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
      wcex.lpszMenuName = NULL;
      wcex.lpszClassName = szWindowClass;
      wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

      if (!RegisterClassEx(&wcex))
      {
      MessageBox(NULL,
      _T("Call to RegisterClassEx failed!"),
      _T("Win32 Guided Tour"),
      NULL);

      return 1;
      }

      hInst = hInstance; // Store instance handle in our global variable

      // The parameters to CreateWindow explained:
      // szWindowClass: the name of the application
      // szTitle: the text that appears in the title bar
      // WS_OVERLAPPEDWINDOW: the type of window to create
      // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
      // 500, 100: initial size (width, length)
      // NULL: the parent of this window
      // NULL: this application does not have a menu bar
      // hInstance: the first parameter from WinMain
      // NULL: not used in this application
      HWND hWnd = CreateWindow(
      szWindowClass,
      szTitle,
      WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, CW_USEDEFAULT,
      500, 100,
      NULL,
      NULL,
      hInstance,
      NULL
      );

      if (!hWnd)
      {
      MessageBox(NULL,
      _T("Call to CreateWindow failed!"),
      _T("Win32 Guided Tour"),
      NULL);

      return 1;
      }

      // The parameters to ShowWindow explained:
      // hWnd: the value returned from CreateWindow
      // nCmdShow: the fourth parameter from WinMain
      ShowWindow(hWnd,
      nCmdShow);
      UpdateWindow(hWnd);

      // Main message loop:
      MSG msg;
      while (GetMessage(&msg, NULL, 0, 0))
      {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
      }

      return (int) msg.wParam;
      }

      //
      // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
      //
      // PURPOSE: Processes messages for the main window.//
      // WM_PAINT - Paint the main window
      // WM_DESTROY - post a quit message and return
      //
      //
      LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
      {
      PAINTSTRUCT ps;
      HDC hdc;
      TCHAR greeting[] = _T("Hello, World!");

      switch (message)
      {
      case WM_PAINT:
      hdc = BeginPaint(hWnd, &ps);

      // Here your application is laid out.// For this introduction, we just print out "Hello, World!"
      // in the top left corner.TextOut(hdc,
      5, 5,
      greeting, _tcslen(greeting));
      // End application-specific layout section.EndPaint(hWnd, &ps);
      break;
      case WM_DESTROY:
      PostQuitMessage(0);
      break;
      default:
      return DefWindowProc(hWnd, message, wParam, lParam);
      break;
      }

      return 0;
      }



  • 相关阅读:
    PAT B1045 快速排序 (25 分)
    PAT B1042 字符统计 (20 分)
    PAT B1040 有几个PAT (25 分)
    PAT B1035 插入与归并 (25 分)
    PAT B1034 有理数四则运算 (20 分)
    PAT B1033 旧键盘打字 (20 分)
    HDU 1231 最大连续子序列
    HDU 1166 敌兵布阵
    HDU 1715 大菲波数
    HDU 1016 Prime Ring Problem
  • 原文地址:https://www.cnblogs.com/HIT-LYT/p/4096704.html
Copyright © 2011-2022 走看看