首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有TreeView和面板内存对话框的首选项对话框

带有TreeView和面板内存对话框的首选项对话框
EN

Stack Overflow用户
提问于 2015-12-21 10:05:37
回答 1查看 160关注 0票数 1

在选择树项时,我有一个带有TreeView和不同面板的选项对话框。

我的第一个问题是,当选项对话框加载时,焦点被设置为默认按钮,即使我删除了它。

我希望将注意力集中在treeview中的第一项上,并将焦点放在。

我尝试设置默认id:

代码语言:javascript
复制
SendMessage(hDlgOptions, DM_SETDEFID, IDC_TREE, 0);

我试图用NEXTDLGCTL设置焦点,但没有成功:

代码语言:javascript
复制
SendMessage(hDlgOptions, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlgOptions, IDC_TREE), TRUE);

我的第二个问题是窗口的动画,当选项对话框出现时,面板已经加载完毕。我想在动画表演之后加载它。

我设定了一个定时器.也许你有更好的解决方案?

非常感谢您的专家评审,我也会为优化我的代码采取所有好的想法。

对话框加载

我想要的

resource.rc

代码语言:javascript
复制
IDD_DIALOG_OPTIONS DIALOGEX 0, 0, 395, 175
    STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
    CAPTION "Options"
    FONT 8, "MS Shell Dlg", 400, 0, 0x1
    BEGIN
        PUSHBUTTON      "OK",ID_BUTTON_SAVE,338,154,50,14
        CONTROL         "Save config to ini file",IDC_CHECK_SAVE_CONFIG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,252,156,82,10
        CONTROL         "",IDC_TREE,"SysTreeView32",TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_SINGLEEXPAND | WS_HSCROLL | WS_TABSTOP,7,7,98,142
    END
    IDD_OPTIONS_CONSOLE DIALOGEX 0, 0, 277, 142
    STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP
    FONT 8, "MS Shell Dlg", 400, 0, 0x1
    BEGIN
        CONTROL         "Take Control",IDC_CHECK_TC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,21,21,57,10
        GROUPBOX        "Console",IDC_STATIC_CONSOLE,7,7,134,66
        COMBOBOX        IDC_COMBO_CONSOLE_COLOR,50,56,85,63,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
        LTEXT           "Color",IDC_STATIC,17,59,18,8
    END

    IDD_OPTIONS_GENERAL DIALOGEX 0, 0, 277, 142
    STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP
    FONT 8, "MS Shell Dlg", 400, 0, 0x1
    BEGIN
        LTEXT           "GENERAL OPTION",IDC_STATIC,89,73,59,8
    END

OptionsDialog

代码语言:javascript
复制
//GLOBAL VARIABLES
#define IDT_TIMER_PANEL 77
HWND hDlgOpt;
HWND hDlgPanelGeneral = NULL;
HWND hDlgPanelConsole = NULL;
UINT iPanelSelect = 1;
//HANDLE MESSAGES FROM GENERAL PANEL
LRESULT CALLBACK PanelGeneral(HWND hDlgPanel, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
    {
        return TRUE;
    }
    }
    return FALSE;
}
//HANDLE MESSAGES FROM CONSOLE PANEL
LRESULT CALLBACK PanelConsole(HWND hDlgPanel, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
    {
        //INIT CONSOLE PANEL CONTROLS
        return TRUE;
    }
    }
    return FALSE;
}
//HANDLE MESSAGES FROM OPTIONS DIALOG
LRESULT CALLBACK Options(HWND hDlgOptions, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
    {
        hDlgOpt = hDlgOptions;
        //LOAD PANEL GENERAL
        HRSRC hrsrc = FindResourceEx(hInst, (LPCWSTR)RT_DIALOG, (LPCWSTR)IDD_OPTIONS_GENERAL, iLanguage);
        HGLOBAL hglb = LoadResource(hInst, hrsrc);
        LPVOID lpsz = LockResource(hglb);
        hDlgPanelGeneral = CreateDialogIndirectW(GetModuleHandleW(NULL), lpsz, hDlgOptions, (DLGPROC)PanelGeneral);
        //LOAD PANEL CONSOLE
        hrsrc = FindResourceEx(hInst, (LPCWSTR)RT_DIALOG, (LPCWSTR)IDD_OPTIONS_CONSOLE, iLanguage);
        hglb = LoadResource(hInst, hrsrc);
        lpsz = LockResource(hglb);
        hDlgPanelConsole = CreateDialogIndirectW(GetModuleHandleW(NULL), lpsz, hDlgOptions, (DLGPROC)PanelConsole);
        //Await the animation window for displaying TreeView and Panel
        SetTimer(hDlgOptions, IDT_TIMER_PANEL, 300, (TIMERPROC) NULL);
        //TRY TO SET DEFAUT ID TO TREEVIEW
        //SendMessage(hDlgOptions, DM_SETDEFID, IDC_TREE, 0);
        //TRY TO FOCUS ON TREEVIEW
        //SendMessage(hDlgOptions, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlgOptions, IDC_TREE), TRUE);
        //INIT CONTROLS
        if (bSaveConfig == TRUE)
        {
            EnableOptionsControls(hDlgPanelConsole);
            SendMessage(GetDlgItem(hDlgOptions, IDC_CHECK_SAVE_CONFIG), BM_SETCHECK, BST_CHECKED, 0);
        }
        else
        {
            DisableOptionsControls(hDlgPanelConsole);
        }
        return TRUE;
    }
    case WM_NOTIFY:
    {
        switch (LOWORD(wParam))
        {
        case IDC_TREE:
            NotifyTreeView(hDlgOptions, lParam, wParam);
            break;
        }
        return TRUE;
    }
    case WM_MOVE:
    {
        //MAYBE ONLY USE WM_MOVING
        UINT xPos = (UINT)LOWORD(lParam);
        UINT yPos = (UINT)HIWORD(lParam);
        SetWindowPos(hDlgPanelGeneral, HWND_TOP, xPos + 162, yPos + 11, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
        SetWindowPos(hDlgPanelConsole, HWND_TOP, xPos + 162, yPos + 11, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
        switch (iPanelSelect)
        {
        case 1: ShowWindow(hDlgPanelGeneral, SW_SHOW); break;
        case 2: ShowWindow(hDlgPanelConsole, SW_SHOW); break;
        }
        return TRUE;
    }
    case WM_MOVING:
    {
        //MAYBE BEST MOVING PANEL WITH THE DIALOG
        //BUT WIN7 HIDE THE CONTENT...
        //NOW HIDE WHEN MOVING
        ShowWindow(hDlgPanelGeneral, SW_HIDE);
        ShowWindow(hDlgPanelConsole, SW_HIDE);
        return TRUE;
    }
    case WM_TIMER:
    {
        switch (wParam)
        {
        case IDT_TIMER_PANEL:
            //LOAD TREEVIEW
            InitTreeView(hDlgOptions);
            KillTimer(hDlgOptions, IDT_TIMER_PANEL);
        }
        return FALSE;
    }
    case WM_COMMAND:
    {
        switch (LOWORD(wParam))
        {
        case ID_BUTTON_SAVE:
        case IDOK:
        case IDCANCEL:
        {
            EndDialog(hDlgOptions, LOWORD(wParam));
            return TRUE;
        }
        break;
        }
    }
    }
    return FALSE;
}
void EnableOptionsControls(HWND hDlgOptions)
{
    EnableWindow(GetDlgItem(hDlgOptions, IDC_CHECK_TC), TRUE);
    EnableWindow(GetDlgItem(hDlgOptions, IDC_COMBO_CONSOLE_COLOR), TRUE);
}
void DisableOptionsControls(HWND hDlgOptions)
{
    EnableWindow(GetDlgItem(hDlgOptions, IDC_CHECK_TC), FALSE);
    EnableWindow(GetDlgItem(hDlgOptions, IDC_COMBO_CONSOLE_COLOR), FALSE);
}
void InitTreeView(HWND hDlgOptions)
{
    TV_INSERTSTRUCT tviis;
    HTREEITEM hitem;
    HIMAGELIST hImageList;
    HWND hTreeView;

    hTreeView = GetDlgItem(hDlgOptions, IDC_TREE);

    hImageList = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDB_BITMAP_TV), 16, 16,
        CLR_DEFAULT, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_DEFAULTCOLOR);

    TreeView_SetImageList(hTreeView, hImageList, TVSIL_NORMAL);

    ZeroMemory(&(tviis.item), sizeof(TV_ITEM));
    tviis.hInsertAfter = TVI_LAST;
    tviis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
    tviis.hParent = TVI_ROOT;
    tviis.item.iImage = 0;
    tviis.item.iSelectedImage = 1;
    tviis.item.lParam = 1;
    tviis.item.pszText = L"General";
    hitem = TreeView_InsertItem(hTreeView, &tviis);

    tviis.hParent = hitem;
    tviis.item.iImage = 2;
    tviis.item.iSelectedImage = 2;
    tviis.item.lParam = 3;
    tviis.item.pszText = L"Dialog";
    TreeView_InsertItem(hTreeView, &tviis);

    tviis.item.iImage = 3;
    tviis.item.iSelectedImage = 3;
    tviis.item.lParam = 4;
    tviis.item.pszText = L"Color";
    TreeView_InsertItem(hTreeView, &tviis);
    //SELECT THE FIRST ITEM
    TreeView_SelectItem(hTreeView, hitem);
    TreeView_Expand(hTreeView, hitem, TVE_EXPAND);

    tviis.hParent = TVI_ROOT;
    tviis.item.iImage = 0;
    tviis.item.iSelectedImage = 1;
    tviis.item.lParam = 2;
    tviis.item.pszText = L"Console";
    hitem = TreeView_InsertItem(hTreeView, &tviis);

    tviis.hParent = hitem;
    tviis.item.iImage = 3;
    tviis.item.iSelectedImage = 3;
    tviis.item.lParam = 5;
    tviis.item.pszText = L"Color";
    TreeView_InsertItem(hTreeView, &tviis);

    tviis.item.iSelectedImage = 2;
    tviis.item.iImage = 2;
    tviis.item.lParam = 6;
    tviis.item.pszText = L"Action";
    TreeView_InsertItem(hTreeView, &tviis);
}
void NotifyTreeView(HWND hDlgOptions, LPARAM lParam, WPARAM wParam)
{
    LPNMTREEVIEW pnm = (LPNMTREEVIEW)lParam;
    //NOTIFY WHEN SELECTION IS CHANGE
    if (((LPNMHDR)lParam)->code == TVN_SELCHANGED)
    {
        RECT wRECT;
        GetWindowRect(hDlgOptions, &wRECT);
        TVITEM tvi;
        HTREEITEM Selected = NULL;
        WCHAR Text[255] = { 0 };

        Selected = TreeView_GetSelection(GetDlgItem(hDlgOptions, IDC_TREE));
        if (Selected == NULL)
            return;

        ZeroMemory(&tvi, sizeof(tvi));
        tvi.mask = TVIF_TEXT;
        tvi.pszText = Text;
        tvi.cchTextMax = 256;
        tvi.hItem = Selected;

        //CHANGE THE PANEL WITH THE SELECT ITEM
        if (TreeView_GetItem(GetDlgItem(hDlgOptions, IDC_TREE), &tvi))
        {
            if (wcscmp(tvi.pszText, L"General") == 0)
            {
                iPanelSelect = 1;
                ShowWindow(hDlgPanelConsole, SW_HIDE);
                SetWindowPos(hDlgPanelGeneral, HWND_TOP, wRECT.left + 165, wRECT.top + 36, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW);
                return;
            }
            if (wcscmp(tvi.pszText, L"Console") == 0)
            {
                iPanelSelect = 2;
                ShowWindow(hDlgPanelGeneral, SW_HIDE);
                SetWindowPos(hDlgPanelConsole, HWND_TOP, wRECT.left + 165, wRECT.top + 36, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW);
                return;
            }
        }
    }
    }
EN

回答 1

Stack Overflow用户

发布于 2015-12-28 17:18:03

选项卡顺序由您的控件在rc文件中列出的顺序定义。把你的车挪开

代码语言:javascript
复制
CONTROL         "",IDC_TREE,...

行将成为BEGIN之后的第一个行。

我不知道你在说什么动画。如果有特定的时间间隔,定时器是延迟某事的一种确定的方式。如果您只是想将Tree控件的初始化推迟到创建和显示完所有内容之后,我将发布一些命令消息,并在其处理程序中执行所有操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34393112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档