FormatMessage,setWindowText,CreateWindow等函数讲解

来源:互联网 发布:幕府将军2全面战争mac 编辑:程序博客网 时间:2024/06/08 03:15
我之前写了一个类似于VS中错误查找对话框,那么此处我将贴出我的代码以供大家学习和使用,里面还有一些函数的使用。比如FormatMessage等函数。这个程序大家可以创建一个win32工程,把代码直接添加进去即可使用。

代码的运行结果图,如下所示:
FormatMessage,setWindowText,CreateWindow等函数讲解


这里是函数ErrorCodeShow.cpp:
// ErrorCodeShow.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "ErrorCodeShow.h"

#define MAX_LOADSTRING 100

// 全局变量:
HINSTANCEhInst; 
                        //当前实例
TCHARszTitle[MAX_LOADSTRING];                //标题栏文本
TCHARszWindowClass[MAX_LOADSTRING];          //主窗口类名
HWNDg_hWndSearch;                        //查找代码信息的window句柄
HWNDg_hWndClose;                        //关闭对话框的window句柄
HWNDg_hWndEdit;;                        //编辑框的window句柄
HWNDg_hWndStatic;                        //静态文字区的window句柄

// 此代码模块中包含的函数的前向声明:
ATOM            MyRegisterClass(HINSTANCE hInstance);
BOOL            InitInstance(HINSTANCE, int);
LRESULTCALLBACK   WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTRCALLBACK   About(HWND, UINT, WPARAM, LPARAM);
BOOL SetStaticInfo(HWND hWnd, LPARAM lParam);
BOOL SetEditInfo(HWND hWnd, LPARAM lParam);
BOOL SetSearchButton(HWND hWnd, LPARAM lParam);
BOOL SetCloseButton(HWND hWnd, LPARAM lParam);
BOOL SetStaticShowInfo(HWND hWnd, LPARAM lParam);
VOID GetEditInfomation();
VOID SearchInfomation(UCHAR);
void ShowErrorInfo(TCHAR str[]);

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                    _In_opt_ HINSTANCE hPrevInstance,
                    _In_ LPTSTR   lpCmdLine,
                    _In_int      nCmdShow)
{
   UNREFERENCED_PARAMETER(hPrevInstance);
   UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO:  在此放置代码。
    MSGmsg;
    HACCELhAccelTable;

    //初始化全局字符串
   LoadString(hInstance, IDS_APP_TITLE, szTitle,MAX_LOADSTRING);
   LoadString(hInstance, IDC_ERRORCODESHOW, szWindowClass,MAX_LOADSTRING);
   MyRegisterClass(hInstance);

    //执行应用程序初始化:
    if(!InitInstance (hInstance, nCmdShow))
    {
       returnFALSE;
    }

    hAccelTable= LoadAccelerators(hInstance,MAKEINTRESOURCE(IDC_ERRORCODESHOW));

    //主消息循环:
    while(GetMessage(&msg, NULL, 0, 0))
    {
       if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
       {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
       }
    }

    return (int)msg.wParam;
}



//
//  函数:  MyRegisterClass()
//
//  目的:  注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXwcex;

    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_ERRORCODESHOW));
   wcex.hCursor       =LoadCursor(NULL, IDC_ARROW);
   wcex.hbrBackground   = (HBRUSH)(COLOR_WINDOW+2);
   wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_ERRORCODESHOW);
   wcex.lpszClassName   = szWindowClass;
   wcex.hIconSm       =LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    returnRegisterClassEx(&wcex);
}

//
//   函数: InitInstance(HINSTANCE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释:
//
//       在此函数中,我们在全局变量中保存实例句柄并
//       创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; //将实例句柄存储在全局变量中

   hWnd =CreateWindow(szWindowClass, szTitle, WS_SYSMENU |WS_MINIMIZEBOX,
     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance,NULL);

   if (!hWnd)
   {
     return FALSE;
   }

   MoveWindow(hWnd, 300, 100,400, 400, TRUE);
   ShowWindow(hWnd,nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  函数:  WndProc(HWND, UINT,WPARAM, LPARAM)
//
// 目的:   处理主窗口的消息。
//
// WM_COMMAND    -处理应用程序菜单
// WM_PAINT    -绘制主窗口
// WM_DESTROY    -发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,LPARAM lParam)
{
    int wmId,wmEvent;
    PAINTSTRUCTps;
    HDChdc;

    switch(message)
    {
    caseWM_KEYDOWN:
       switch(wParam)
       {
       caseVK_LEFT:
         MessageBox(NULL, L"左键按下", L"Success", MB_OK);

         

          break;
       }
       break;
    caseWM_CREATE:
      SetStaticInfo(hWnd, lParam);
      
      SetEditInfo(hWnd, lParam);
      
      SetSearchButton(hWnd, lParam);
      
      SetCloseButton(hWnd, lParam);

      SetStaticShowInfo(hWnd, lParam);
       break;
    caseWM_COMMAND:
      wmId    =LOWORD(wParam);
       wmEvent =HIWORD(wParam);
       //分析菜单选择:
       switch(wmId)
       {
       caseIDC_BUTTON_SEARCH:      //响应查找消息
         GetEditInfomation();
          break;
       caseIDC_BUTTON_CLOSE:      //相应退出消息
         PostQuitMessage(0);
          break;
       caseIDM_ABOUT:
         DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
          break;
       caseIDM_EXIT:
         DestroyWindow(hWnd);
          break;
      default:
          returnDefWindowProc(hWnd, message, wParam, lParam);
       }
       break;
    caseWM_PAINT:
       hdc =BeginPaint(hWnd, &ps);
       //TODO:  在此添加任意绘图代码...
      EndPaint(hWnd, &ps);
       break;
    caseWM_DESTROY:
      PostQuitMessage(0);
       break;
   default:
       returnDefWindowProc(hWnd, message, wParam, lParam);
    }
    return0;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam,LPARAM lParam)
{
   UNREFERENCED_PARAMETER(lParam);
    switch(message)
    {
    caseWM_INITDIALOG:
       return(INT_PTR)TRUE;

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

BOOL SetStaticInfo(HWND hWnd, LPARAM lParam)
{
    HWNDhWndStatic;
    hWndStatic =CreateWindowW(L"static",
      L"错误代码:",
       WS_CHILD |WS_VISIBLE | SS_CENTER,
       20, 10, 70,20,
       hWnd,(HMENU)1,
      ((LPCREATESTRUCT)lParam)->hInstance, NULL);
    if (NULL ==hWndStatic)
    {
       returnFALSE;
    }
    returnTRUE;
}


BOOL SetEditInfo(HWND hWnd, LPARAM lParam)
{
   
    g_hWndEdit =CreateWindowW(L"edit",
       NULL,
       WS_CHILD |WS_VISIBLE ,
       110, 10, 70,20,
       hWnd,
       NULL, NULL,NULL);
    if (NULL ==g_hWndEdit)
    {
       returnFALSE;
    }
    returnTRUE;
}

BOOL SetSearchButton(HWND hWnd, LPARAM lParam)
{
    g_hWndSearch= CreateWindow(L"button",
       L"查找",
       WS_CHILD |WS_VISIBLE,
       210, 10, 70,20,
       hWnd,(HMENU)IDC_BUTTON_SEARCH,
      ((LPCREATESTRUCT)lParam)->hInstance, NULL);
    if (NULL ==g_hWndSearch)
    {
       returnFALSE;
    }
    returnTRUE;
}

BOOL SetCloseButton(HWND hWnd, LPARAM lParam)
{
    g_hWndClose= CreateWindowW(L"button",
       L"退出",
       WS_CHILD |WS_VISIBLE,
       290, 10, 70,20,
       hWnd,(HMENU)IDC_BUTTON_CLOSE,
      ((LPCREATESTRUCT)lParam)->hInstance, NULL);
    if (NULL ==g_hWndClose)
    {
       returnFALSE;
    }
    returnTRUE;
}

BOOL SetStaticShowInfo(HWND hWnd, LPARAM lParam)
{

    g_hWndStatic= CreateWindowW(L"static",
       NULL,
       WS_CHILD |WS_VISIBLE | SS_LEFT,
       20, 50, 340,280,
       hWnd,(HMENU)1,
      ((LPCREATESTRUCT)lParam)->hInstance, NULL);
    if (NULL ==g_hWndStatic)
    {
       returnFALSE;
    }
    returnTRUE;
}

VOID GetEditInfomation()
{
    WCHARwcEditInfo[128];
   GetWindowText(g_hWndEdit, wcEditInfo, sizeof(wcEditInfo));
    unsigned intuiErrorvalue= (unsigned int)atoi((const char*)wcEditInfo);
   SearchInfomation(uiErrorvalue);
}

VOID SearchInfomation(UCHAR ucErrorValue)
{
    TCHARstr[MAXBYTE] = L"\0";
    memset(str,0, sizeof(str));
    DWORD count= 0;
    count =FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS ,
       NULL,ucErrorValue, NULL, str, sizeof(str), NULL);
    if(count)
    {
      ShowErrorInfo(str);
      LocalFree(str);
    }
    else
    {
       //HMODULEhModule = LoadLibrary(L"netmsg.dll");
       //if(hModule)
       //{
      //    count =FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |FORMAT_MESSAGE_IGNORE_INSERTS ,
      //       hModule,ucErrorValue, NULL, str, sizeof(str), NULL);
      //    if(count)
      //    {
      //      ShowErrorInfo(str);
      //      //LocalFree(str);
      //    }
      //   FreeLibrary(hModule);
       //}
      ShowErrorInfo((TCHAR*)L"没有找到错误信息");
    }
   
}

VOID ShowErrorInfo(TCHAR str[])
{
   //SetWindowTextW(g_hWndStatic, L"");
   SetWindowTextW(g_hWndStatic,str);
}

我们在Resource.h中添加这样的代码。
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by ErrorCodeShow.rc
//

#defineIDS_APP_TITLE          103

#defineIDR_MAINFRAME          128
#defineIDD_ERRORCODESHOW_DIALOG   102
#defineIDD_ABOUTBOX          103
#defineIDM_ABOUT             104
#defineIDM_EXIT             105
#defineIDI_ERRORCODESHOW          107
#defineIDI_SMALL             108
#defineIDC_ERRORCODESHOW          109
#defineIDC_BUTTON_SEARCH       111
#defineIDC_BUTTON_CLOSE      112
#defineIDC_MYICON             2
#ifndef IDC_STATIC
#defineIDC_STATIC             -1
#endif
// 新对象的下一组默认值
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS

#define_APS_NO_MFC                130
#define_APS_NEXT_RESOURCE_VALUE   129
#define_APS_NEXT_COMMAND_VALUE       32771
#define_APS_NEXT_CONTROL_VALUE       1000
#define_APS_NEXT_SYMED_VALUE       110
#endif
#endif

这两行是对应的button按钮的ID值。
原创粉丝点击