有一些代码可以创建对话窗口
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
我的代码中的错误在哪里?
P.S。抱歉我的英语不好 P.P.S. Happy New Yaer !!!
答案 0 :(得分:1)
将此作为资源重新编写大约需要5分钟,并使用DialogBox启动它。没有疯狂的字符串转换。没有指针数学。
resource.rc有这个:
IDD_DIALOG1 DIALOGEX 0, 0, 187, 90
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Your caption here"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
CONTROL "Radio1",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,7,15,38,10
CONTROL "Radio2",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,7,31,38,10
CONTROL "Radio3",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,7,46,38,10
PUSHBUTTON "Button1",IDC_BUTTON1,130,69,50,14
PUSHBUTTON "Button2",IDC_BUTTON2,71,69,50,14
PUSHBUTTON "Button3",IDC_BUTTON3,7,69,50,14
END
相应的代码就是这样:
#include <Windows.h>
#include "resource.h"
BOOL __stdcall DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
{
if (LOWORD(wParam) == IDCANCEL || LOWORD(wParam) == IDOK)
{
EndDialog(hwnd, 0);
return 1;
}
}
}
return 0;
}
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpcmdline, int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
return 0;
}
下载整个项目供您使用