有一些代码,创建对话框窗口
HWND CreateDlg( HWND hwnd, WORD *pdlgtemplate)
{
TCHAR const caption[ ]=_T("Change state of programm");
TCHAR const stattxt[ ]=_T("Now should");
TCHAR const modeoff[ ]=_T("Close");
TCHAR const modedat[ ]=_T("Reload");
TCHAR const modepsw[ ]=_T("Change user");
WORD *p; p=pdlgtemplate;
int cxChar, cyChar;
{TEXTMETRIC tm;
HDC hdc=GetDC(hwnd);
GetTextMetrics(hdc,&tm);
ReleaseDC(hwnd,hdc);
cxChar=tm.tmAveCharWidth+1;
cyChar=tm.tmHeight+tm.tmExternalLeading; }
DWORD dlgunit =GetDialogBaseUnits();
int dlgwunit=LOWORD(dlgunit), dlghunit=HIWORD(dlgunit);
cxChar=cxChar*4/dlgwunit;
cyChar=cyChar*8/dlghunit;
int wDlg, hDlg, wItem, hItem, left, top;
DWORD IStyle;
//Записываем в шаблон данные панели
IStyle = DS_CENTER | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION;
wDlg=lstrlen(caption)*cxChar;
hDlg=cyChar*10;
DlgTemplate(p,IStyle, 7,0,0, wDlg, hDlg, (LPSTR)caption);
//Далее добавляем записи для элементов управления
//1
hItem=cyChar;
top=left=hItem/2;
hItem+=left;
wItem=(wDlg-left-left);
IStyle = WS_CHILD | WS_VISIBLE | BS_GROUPBOX | WS_TABSTOP;
DlgItemTemplate(p, IStyle, left, top, wItem, 4*hItem+left, ID_STATIC,(LPSTR) "button",(LPSTR)stattxt);
//2
wItem=lstrlen(modeoff)*cxChar+10; top+=hItem; IStyle = BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP;
DlgItemTemplate(p, IStyle, hItem, top, wItem, hItem, ID_BUTTON1, (LPSTR)"button", (LPSTR)modeoff);
//3
wItem=lstrlen(modedat)*cxChar+10; top+=hItem; IStyle = BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE;
DlgItemTemplate(p, IStyle, hItem, top, wItem, hItem, ID_BUTTON2, "button", (LPSTR)modedat);
//4
wItem=lstrlen(modepsw)*cxChar+10; top+=hItem; IStyle = BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE;
DlgItemTemplate(p, IStyle, hItem, top, wItem, hItem, ID_BUTTON3, (LPSTR)"button", (LPSTR)modepsw);
//5
wItem=(wDlg-left-left-hItem-hItem)/3; top+=hItem+hItem/2+left; IStyle = BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_TABSTOP;
DlgItemTemplate(p, IStyle, left, top, wItem, hItem, IDOK,(LPSTR)"button",(LPSTR)"Ok");
//6
IStyle = BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_TABSTOP;
DlgItemTemplate(p, IStyle, left+wItem+hItem, top, wItem, hItem, IDCANCEL,(LPSTR)"button",(LPSTR)"No");
//7
DlgItemTemplate(p, IStyle, left+wItem+hItem+wItem+hItem, top, wItem, hItem, ID_HELP, (LPSTR)"button",(LPSTR)"help");
//Создаем немодальное диалоговое окно
HWND hdlg=CreateDialogIndirect(hInstance, (LPDLGTEMPLATE)pdlgtemplate,hwnd, (DLGPROC)DlgProc);
return hdlg; }
还有一些代码,将模板写入内存。
int nCopyAnsiToWideChar (LPWORD lpWCStr, LPSTR lpAnsiIn)
{ int nChar = 0;
do {
*lpWCStr++ = (WORD) *lpAnsiIn;
nChar++;
} while (*lpAnsiIn++);
return nChar;
}
LPWORD lpwAlign( LPWORD lpIn)
{
ULONG ul;
ul = (ULONG) lpIn;
ul +=3;
ul >>=2;
ul <<=2;
return (LPWORD) ul;
}
void DlgItemTemplate(PWORD& p, DWORD IStyle, int x, int у, int cx, int cy, WORD id, LPSTR
classname, LPSTR txt)
{
*p++ = LOWORD(IStyle); // В первые два слова
*p++ = HIWORD(IStyle); //записываем стиль элемента управления
*p++ = 0; //В следующие две строки можно
*p++ = 0; //записать расширенный стиль окна
*p++ = x; //Координата левого края элемента управления
*p++ = у; //Координата верхнего фая элемента управления
*p++ = cx; //Ширина элемента управления
*p++ = cy; //Высота элемента управления
*p++ = id; //Идентификатор элемента управления int nchar= nCopyAnsiToWideChar( p, (LPSTR)(classname));
p += nchar; //Смещаем указатель на количество символов //Преобразуем Ansi-строку заголовка в строку Unicode
if (!strlen( txt) > 0) nchar = nCopyAnsiToWideChar( p, (LPSTR)( txt)); else nchar = nCopyAnsiToWideChar(p,(LPSTR)("")); p += nchar; //Смещаем указатель на число символов
*p++ = 0; //Дополнительные данные не используем //Выравниваем шаблон по границе
p=lpwAlign((LPWORD)p);
}
void DlgTemplate(PWORD& p, DWORD IStyle, int items, int x, int y, int cx, int cy, LPSTR txt)
{
*p++ = LOWORD(IStyle); //В первые два слова
*p++ = HIWORD(IStyle); //записываем стиль панели
*p++ = 0; //В следующие две строки можно
*p++ = 0; //записать расширенный стиль окна
*p++ = items; //Число элементов управления панели
*p++ = x; //Координата левого края панели
*p++ = y; //Координата верхнего края панели
*p++ = cx; //Ширина панели
*p++ = cy; //Высота панели
*p++ = 0; //Меню не подключается
*p++ = 0; //Используем стандартный класс
//Преобразуем Ansi-строку заголовка в строку Unicode
int nchar=nCopyAnsiToWideChar(p,(LPSTR)txt);
p += nchar; //Смещаем указатель на количество символов
//Выравниваем шаблон по границе WORD
p=lpwAlign((LPWORD)p); }
最后他给出了一些奇怪的东西......
http://s14.postimage.org/z7wg0ang1/image.png
我的代码中的错误在哪里?
PS对不起我的英语不好。
PPS 新年快乐!!!