目前共有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許可協議進行許可。