对于自己写的ErrorShow程序不足的地方的改进。
No.1Edit_LimitText(GetDlgItem(hwnd,IDC_ERRORSHOW),8);限定Edit控件的输入长度
No.2
EnableWindow(GetDlgItem(hwnd, IDOK), Edit_GetTextLength(hwndCtl) > 0);
当EDIT控件什么也没有输入的时候,按钮不可用。
这两个算是小技巧。
下面是完整的代码:
#include <stdio.h>
#include <stdlib.h>
#include<windowsx.h>
#include <Windows.h>
BOOL CALLBACK DlgErrorShow (HWND hwnd ,UINT message ,WPARAM wParam ,LPARAM lParam );
int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance,PSTR szCmdLine ,int iCmdShow)
{
DialogBox(hInstance,LPCTSTR(101),NULL,DlgErrorShow);
}
BOOL CALLBACK DlgErrorShow (HWND hwnd ,UINT message ,WPARAM wParam ,LPARAM lParam )
{
HLOCAL hlocal = NULL;
DWORD dwError,systemLocale;
BOOL fok;
HMODULE hDLL;
switch (message)
{
case WM_INITDIALOG:
Edit_LimitText(GetDlgItem(hwnd,1001),8);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case 1001:
EnableWindow(GetDlgItem(hwnd, 1002), Edit_GetTextLength(GetDlgItem(hwnd,1001)) > 0);
break;
case 1002:
dwError = GetDlgItemInt(hwnd,1001 ,NULL,FALSE);
systemLocale = MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL);
fok= FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_ALLOCATE_BUFFER,NULL,dwError,systemLocale,(PTSTR)&hlocal,0,NULL);
if (!fok)
{
hDLL = LoadLibraryEx(L"netmsg.dll",NULL,DONT_RESOLVE_DLL_REFERENCES);
if (hDLL != NULL)
{
fok = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_HMODULE|FORMAT_MESSAGE_IGNORE_INSERTS,hDLL,dwError,systemLocale,(PTSTR)&hlocal,0,NULL);
FreeLibrary(hDLL);
}
}
if (fok &&(hlocal != NULL))
{
SetDlgItemText(hwnd,1003,(PCTSTR)LocalLock(hlocal));
LocalFree(hlocal);
}
else
{
SetDlgItemText(hwnd,1003,L"No text fount for this error number.");
}
break;
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
}
return 0 ;
}
FormatMessage函数:
FORMAT_MESSAGE_FROM_SYSTEM:希望获得一个系统定义的错误代码对应的字符串。
FORMAT_MESSAGE_ALLOCATE_BUFFER:要求函数分配一块足以容纳错误文本描述的内容。此块内存的句柄将返回到第5个参数中。
FORMAT_NEUTRAL|SUBLANG_NEUTRAL:操作系统的默认语言