不带(桌面)窗口的可滚动对话框

问题描述 投票:0回答:1

这个可滚动对话框的示例 https://www.codeproject.com/articles/32925/scrollable-dialog-in-pure-win32-api

工作正常,并显示对话框 我的问题是这个对话框=桌面窗口 或者桌面窗口丢失了? 任何将代码放入 vs2022 C++ 桌面的尝试 用于显示桌面窗口的应用程序 和顶部的对话框...失败 这是 WinMain 和 DialogBox 宏

int WINAPI _tWinMain(
    HINSTANCE hInstance,
    //HINSTANCE /*hPrevInstance*/,
    HINSTANCE hPrevInstance,
    LPWSTR /*lpCmdLine*/,
    int /*nShowCmd*/)  //   THIS DIFFERENT NCMDSHOW USED IN MAINWIN
{
    DialogBox(
        hInstance,
        MAKEINTRESOURCE(IDD_DIALOG1),
        GetDesktopWindow(),
        SD_DialogProc);

    return 0;
}

INT_PTR CALLBACK SD_DialogProc(
    HWND hwndDlg,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam)
{
    switch(uMsg)
    {
    HANDLE_MSG(hwndDlg, WM_INITDIALOG, SD_OnInitDialog);
    HANDLE_MSG(hwndDlg, WM_COMMAND, SD_OnCommand);
    HANDLE_MSG(hwndDlg, WM_SIZE, SD_OnSize);
    HANDLE_MSG(hwndDlg, WM_HSCROLL, SD_OnHScroll);
    HANDLE_MSG(hwndDlg, WM_VSCROLL, SD_OnVScroll);
    }

    return FALSE;
}

对话框

IDD_DIALOG1 DIALOGEX 0, 0, 316, 185
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_VSCROLL | WS_HSCROLL | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    EDITTEXT        IDC_EDIT1,7,6,291,14,ES_AUTOHSCROLL
    PUSHBUTTON      "Button1",IDC_BUTTON1,6,30,50,14
    CONTROL         "Check1",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,54,39,10
    GROUPBOX        "Static",IDC_STATIC,7,70,110,50
    CONTROL         "Radio1",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,12,84,38,10
    CONTROL         "Radio2",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,102,38,10
    LTEXT           "Sample Static Control",IDC_STATIC,6,126,108,8
    DEFPUSHBUTTON   "OK",IDOK,194,154,50,14
    PUSHBUTTON      "Cancel",IDCANCEL,248,154,50,14
END

已合并滚动对话框所需的信息 .RC .H 使用 CreateWindow() 到项目应用程序。

注意:此代码没有 WinProc(){ }

显然,这个WinMain是一个有效的入口点,但没有CreateWindow 实例和注册?我们不应该期望看到 桌面窗口?

因此这个WinMain只允许DialogBox的初始化,但是 没有任何对桌面CreateWindow的引用

尝试将代码包含/合并到 vs2022 C++/desktop 中, 桌面窗口出现,但对话框未能出现, 经过多次尝试如何包含对话框宏后, 在WinMain或实例或注册...等...

一个有趣的问题: 此代码的解决方案资源管理器出现在代码编辑器旁边 在应用程序文件中,单击打开项目时的 .sln vs2022。 当 .rc 或任何其他模块从文件目录中单击时 它不会在应用的文本编辑器中打开 ""致命错误 RC1015: 无法打开包含文件'afxres.h'"" MFC加载到vs2022.... 然而; 只会在另一个同时打开的项目X中打开 施罗尔项目。

对话框现在是否被视为桌面菜单? 可以用桌面窗口来显示应用程序吗 元素和这个对话框的好例子?

文档显示了位于下面的模式对话框代码 WM-DELETEITEM(学习:deleteItme 示例)

case IDM_DELETEITEM: 
            if (DialogBox(hinst, 
                          MAKEINTRESOURCE(DLG_DELETEITEM), 
                          hwnd, 
                          (DLGPROC)DeleteItemProc)==IDOK) 
            {
                // Complete the command; szItemName contains the 
                // name of the item to delete. 
            }

此代码从 -tWinMain() { DialogBox( ); 启动宏}

在项目应用程序中找到对话框宏的位置 因为我无法在 WM_INITDIALOG 下调用它 将 SD_DialogProc() 放置在 WinProc() 中的 WM_INITDIALOG 下

尝试使用的 WinProc() 部分? 我们如何让 WinMain 调用 WM_INITDIALOG ???

 case WM_INITDIALOG: 
     //  add
     // Get the owner window and dialog box rectangles. 
     //You create a modal dialog box by using the DialogBox function.
     //  You must specify the identifier or name of a dialog box template resource
     //  and a pointer to the dialog box procedure.
     //  The DialogBox function loads the template, 
     // displays the dialog box, and processes all user input 
     // the application specifies its main window as the owner window for the dialog box. 
   
     if ((hwndOwner = GetParent(hwndDlg)) == NULL)
     {
         hwndOwner = GetDesktopWindow();
     }

     GetWindowRect(hwndOwner, &rcOwner);
     GetWindowRect(hwndDlg, &rcDlg);
     CopyRect(&rc, &rcOwner);

     DialogBox(
         hInstance,
         MAKEINTRESOURCE(IDD_DIALOG1),
         GetDesktopWindow(),  // RETURN HANDLE TO MAIN WINDOW JUST LIKE hwnd, 
         SD_DialogProc);
    // SD_DialogProc;

     // Offset the owner and dialog box rectangles so that right and bottom 
 // values represent the width and height, and then offset the owner again 
 // to discard space taken up by the dialog box. 

     OffsetRect(&rcDlg, -rcDlg.left, -rcDlg.top);
     OffsetRect(&rc, -rc.left, -rc.top);
     OffsetRect(&rc, -rcDlg.right, -rcDlg.bottom);

     // The new position is the sum of half the remaining space and the owner's 
// original position. 

     SetWindowPos(hwndDlg,
         HWND_TOP,
         rcOwner.left + (rc.right / 2),
         rcOwner.top + (rc.bottom / 2),
         0, 0,          // Ignores size arguments. 
         SWP_NOSIZE);

     if (GetDlgCtrlID((HWND)wParam) != ID_ITEMNAME)
     {
         SetFocus(GetDlgItem(hwndDlg, ID_ITEMNAME));
         return FALSE;
     }

     return TRUE;

     break;

就这些了,抱歉写了太多!

上述所有操作均已完成,但没有任何效果来获取桌面窗口 以及 DialogBox() nacro

的代码
c++ winapi scroll dialog c++17
1个回答
0
投票

合并的资源定义文件 (.rc) 中可能存在一些问题。 以下代码对我有用。

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

//IDD_ABOUTBOX DIALOGEX 0, 0, 102, 43
//your definition

IDD_DIALOG1 DIALOGEX 0, 0, 316, 185
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_VSCROLL | WS_HSCROLL | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    EDITTEXT        IDC_EDIT1,7,6,291,14,ES_AUTOHSCROLL
    PUSHBUTTON      "Button1",IDC_BUTTON1,6,30,50,14
    CONTROL         "Check1",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,54,39,10
    GROUPBOX        "Static",IDC_STATIC1,7,70,110,50
    CONTROL         "Radio1",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,12,84,38,10
    CONTROL         "Radio2",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,102,38,10
    LTEXT           "Sample Static Control",IDC_STATIC,6,126,108,8
    DEFPUSHBUTTON   "OK",IDOK,194,154,50,14
    PUSHBUTTON      "Cancel",IDCANCEL,248,154,50,14
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_ABOUTBOX, DIALOG
    BEGIN
        LEFTMARGIN, 7
        TOPMARGIN, 7
    END

    IDD_DIALOG1, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 298
        TOPMARGIN, 7
        BOTTOMMARGIN, 168
    END
END
#endif    // APSTUDIO_INVOKED

DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,SD_DialogProc);

© www.soinside.com 2019 - 2024. All rights reserved.