-1

有一些代码,创建对话框窗口

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 新年快乐!!!

4

1 回答 1

1

将其重写为资源并使用 DialogBox 启动它大约需要 5 分钟。没有疯狂的字符串转换。没有指针数学。

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;
}

您可以在以下网址下载整个项目供您使用:http ://www.selbie.com/dialogapp.zip

于 2012-12-31T21:45:59.693 回答