我之前写了一个类似于VS中错误查找对话框,那么此处我将贴出我的代码以供大家学习和使用,里面还有一些函数的使用。比如FormatMessage等函数。这个程序大家可以创建一个win32工程,把代码直接添加进去即可使用。
代码的运行结果图,如下所示:
这里是函数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值。
代码的运行结果图,如下所示:
这里是函数ErrorCodeShow.cpp:
// ErrorCodeShow.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "ErrorCodeShow.h"
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCEhInst;
TCHARszTitle[MAX_LOADSTRING];
TCHARszWindowClass[MAX_LOADSTRING];
HWNDg_hWndSearch;
HWNDg_hWndClose;
HWNDg_hWndEdit;;
HWNDg_hWndStatic;
// 此代码模块中包含的函数的前向声明:
ATOM
BOOL
LRESULTCALLBACK
INT_PTRCALLBACK
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,
{
}
//
//
//
//
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
}
//
//
//
//
//
//
//
//
//
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
}
//
//
//
//
//
//
//
//
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,LPARAM lParam)
{
}
// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam,LPARAM 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 ucErrorValue)
{
}
VOID ShowErrorInfo(TCHAR str[])
{
}
我们在Resource.h中添加这样的代码。
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by ErrorCodeShow.rc
//
#defineIDS_APP_TITLE
#defineIDR_MAINFRAME
#defineIDD_ERRORCODESHOW_DIALOG
#defineIDD_ABOUTBOX
#defineIDM_ABOUT
#defineIDM_EXIT
#defineIDI_ERRORCODESHOW
#defineIDI_SMALL
#defineIDC_ERRORCODESHOW
#defineIDC_BUTTON_SEARCH
#defineIDC_BUTTON_CLOSE
#defineIDC_MYICON
#ifndef IDC_STATIC
#defineIDC_STATIC
#endif
// 新对象的下一组默认值
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define_APS_NO_MFC
#define_APS_NEXT_RESOURCE_VALUE
#define_APS_NEXT_COMMAND_VALUE
#define_APS_NEXT_CONTROL_VALUE
#define_APS_NEXT_SYMED_VALUE
#endif
#endif
这两行是对应的button按钮的ID值。