剖筋去骨,只具有最基本的Win32架构的程序。还原Win32 sdk下程序的本来面目!

本文介绍了一个基于 Win32 SDK 的简单窗口应用程序实现。通过注册窗口类、创建窗口并处理消息循环等步骤,展示了如何响应鼠标点击及显示关于对话框等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

改写自候捷的generic.c

//---------------------------------------------------------------------
// 文件     : generic.c
// 作者     : gencheng
// 编译连接   : 请参考 generic.mak
//---------------------------------------------------------------------

#include <windows.h>   // 每一个Windows程序都需要载入此头文件
#include "resource.h"  // 内含各个 resource IDs

HINSTANCE _hInst;      // Instance handle
HWND      _hWnd;

char _szAppName[] = "Generic";   
char _szTitle[]   = "Base Win32 SDK Application"; 

//---------------------------------------------------------------------
// About - 对话框函数
//---------------------------------------------------------------------
LRESULT CALLBACK About(HWND hDlg,     UINT message,
                       WPARAM wParam, LPARAM lParam)
{
  UNREFERENCED_PARAMETER(lParam);     

  switch (message) {
    case WM_INITDIALOG:
         return (TRUE);     

    case WM_COMMAND:
         if (LOWORD(wParam) == IDOK
             || LOWORD(wParam) == IDCANCEL) {
             EndDialog(hDlg, TRUE);
             return (TRUE); 
         }
         break;
  }
  return (FALSE);
}


//---------------------------------------------------------------------
// WndProc - 窗口函数
//---------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd,     UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;

  switch (message) {
    case WM_COMMAND:

         wmId    = LOWORD(wParam);
         wmEvent = HIWORD(wParam);

         switch (wmId) {
           case IDM_ABOUT:
                DialogBox(_hInst,
                          "AboutBox",    
                          hWnd,          
                          (DLGPROC)About 
                         );
                break;

           case IDM_EXIT:                
                DestroyWindow (hWnd);
                break;

           default:
                return (DefWindowProc(hWnd, message, wParam, lParam));
         }
         break;
    case WM_LBUTTONDOWN:
   MessageBox(hWnd, "鼠标左键单击!", "消息", MB_ICONINFORMATION);
         break;
    case WM_RBUTTONDOWN:
   MessageBox(hWnd, "鼠标右键单击!", "消息", MB_ICONINFORMATION);
         break;

    case WM_DESTROY: 
         PostQuitMessage(0);
         break;   
    default:
         return (DefWindowProc(hWnd, message, wParam, lParam));
  }
  return (0);
}


//---------------------------------------------------------------------
// WinMain - 程序进入点
//---------------------------------------------------------------------
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine,     int nCmdShow)
{
MSG msg;
WNDCLASS  wc;

  UNREFERENCED_PARAMETER(lpCmdLine);      // 避免编译时的警告 

  wc.style         = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc   = (WNDPROC)WndProc;    
  wc.cbClsExtra    = 0;
  wc.cbWndExtra    = 0;
  wc.hInstance     = hInstance;
  wc.hIcon         = LoadIcon(hInstance, "jjhouricon");
  wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = GetStockObject(WHITE_BRUSH);  // 窗口后台颜色
  wc.lpszMenuName  = "GenericMenu";                // .RC 所定义的窗体
  wc.lpszClassName = _szAppName;
 
  RegisterClass(&wc); 

  _hInst = hInstance; // 存储为全局变量,方便使用
  _hWnd = CreateWindow(                 //CreateWindow()
                       _szAppName,
                       _szTitle,
                       WS_OVERLAPPEDWINDOW,
                       CW_USEDEFAULT,
                       CW_USEDEFAULT,
                       CW_USEDEFAULT,
                       CW_USEDEFAULT,
                       NULL,
                       NULL,
                       hInstance,
                       NULL
                      );

  if (!_hWnd)
     return (FALSE);
 
  ShowWindow(_hWnd, nCmdShow);
  UpdateWindow(_hWnd); 

  /*--以下是主消息循环--*/
  while (GetMessage(&msg, NULL, 0, 0)) {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
  }

  return (msg.wParam);
}

//------------------------ end of file ------------------------------

     个人感觉,我修改的这个源程序,比候捷的哪个更简洁,基本是用Win32 SDK 堆砌构建而成。


     总结一下,创建一个窗口,必须需要用到以下Win32 API:

RegisterClass 为程序窗口注册窗口类别。  
  
CreateWindow 根据窗口类别建立一个窗口。
  
ShowWindow 在屏幕上显示窗口。
  
UpdateWindow 指示窗口自我更新。
  
GetMessage 从消息队列中取得消息。
  
TranslateMessage 转译某些键盘消息。
  
DispatchMessage 将消息发送给窗口消息处理程序。 
  
PostQuitMessage 在消息队列中插入一个「退出程序」消息。
  
DefWindowProc 执行内定的消息处理。
  
这些函数均在MSDN文件中有说明,VC中在不同的表头文件中声明,其中绝大多数声明在WINUSER.H中。

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值