目前共有1篇帖子。
失败的IndirectDialog代码
1樓 巨大八爪鱼 2016-9-26 22:32
#include <tchar.h>
#include <Windows.h>
#include <windowsx.h>

#define ID_HELP 150
#define ID_TEXT 200

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    int nLen;
    int wmId, wmEvent;
    LPTSTR lpstr;

    switch (uMsg)
    {
    case WM_COMMAND:
        wmId = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        switch (wmId)
        {
        case IDOK:
        case IDCANCEL:
            EndDialog(hDlg, wmId);
            break;
        case ID_HELP:
            MessageBox(hDlg, TEXT("帮助内容"), TEXT("帮助标题"), MB_ICONINFORMATION);
            break;
        case ID_TEXT:
            if (wmEvent == STN_CLICKED)
            {
                nLen = Static_GetTextLength((HWND)lParam);
                lpstr = (LPTSTR)malloc((nLen + 1) * sizeof(TCHAR));
                Static_GetText((HWND)lParam, lpstr, nLen + 1);
                MessageBox(hDlg, lpstr, TEXT("文本内容"), MB_ICONINFORMATION);
                free(lpstr);
            }
        }
        break;
    }
    return FALSE;
}

// 使地址能被32整除
void align32(LPWORD *ptr)
{
    //*ptr = (LPWORD)((((ULONG)*ptr + 3) >> 2) << 2);

    ULONG ul;
    ul = (ULONG)*ptr;
    ul += 3;
    ul >>=2;
    ul <<=2;
    *ptr = (LPWORD)ul;
}

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    LPWORD p;
    struct
    {
        DLGTEMPLATE tpl;
        WORD menu;
        WORD cls;
        WCHAR title[6];

        // 剩下的内容无法在结构体中表示, 因为无法确保地址能够被32整除
        BYTE controls[1000];
    } dlg;

    struct
    {
        DLGITEMTEMPLATE item;
        WORD menu;
        WORD cls;
        WCHAR text[3];
        WORD creation_data;
    } btn;
    
    // 对话框样式
    dlg.tpl.style = WS_POPUP | WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | DS_CENTER | DS_MODALFRAME; // 对话框样式
    dlg.tpl.dwExtendedStyle = (DWORD)NULL; // 对话框扩展样式
    dlg.tpl.cdit = 1; // 控件数量
    dlg.tpl.x = dlg.tpl.y = 0; // 对话框坐标, 单位: DU (对话框单位, Dialog Box Unit), 由于已在style中指定了DS_CENTER, 所以居中显示
    dlg.tpl.cx = 100; // 对话框宽度 (DU)
    dlg.tpl.cy = 100; // 对话框高度 (DU)

    dlg.menu = dlg.cls = (WORD)NULL; // 无菜单、对话框类
    lstrcpyW(dlg.title, L"示例对话框"); // 对话框标题, 必须为宽字符串

    // 确定按钮
    btn.item.style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;
    btn.item.dwExtendedStyle = (DWORD)NULL;
    btn.item.x = 10;
    btn.item.y = 70;
    btn.item.cx = 80;
    btn.item.cy = 20;
    btn.item.id = IDOK;
    btn.menu = 0xffff;
    btn.cls = 0x80;
    lstrcpyW(btn.text, L"确定");
    btn.creation_data = (WORD)NULL;

    ZeroMemory(&dlg.controls, sizeof(dlg.controls));
    p = (LPWORD)&dlg.controls;
    align32(&p); // 使地址能够被32整除
    memcpy(p, &btn, sizeof(btn));
    p += sizeof(btn);

    // 帮助按钮
    btn.item.style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;
    btn.item.dwExtendedStyle = (DWORD)NULL;
    btn.item.x = 55;
    btn.item.y = 10;
    btn.item.cx = 40;
    btn.item.cy = 20;
    btn.item.id = ID_HELP;
    btn.menu = 0xffff;
    btn.cls = 0x80;
    lstrcpyW(btn.text, L"帮助");
    btn.creation_data = (WORD)NULL;

    align32(&p);
    memcpy(p, &btn, sizeof(btn));
    p += sizeof(btn);

    // 弹出对话框
    DialogBoxIndirect(hInstance, &dlg.tpl, NULL, DlgProc);
    return 0;
}

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
 
 
©2010-2024 Arslanbar [手機版] [桌面版]
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。