C 带有树状视图和面板内存对话框的首选项对话框

C 带有树状视图和面板内存对话框的首选项对话框,c,winapi,dialog,treeview,win32gui,C,Winapi,Dialog,Treeview,Win32gui,我有一个选项对话框,旁边有一个TreeView和不同的面板,当我选择tree项时,我更改了它 我的第一个问题是,当选项对话框加载时,焦点被设置为默认按钮,即使我删除了它 我想把焦点放在树状视图中的第一个项目上,并将焦点放在第一个项目上 我尝试设置默认id: SendMessage(hDlgOptions, DM_SETDEFID, IDC_TREE, 0); 我试图用NEXTDLGCTL设置焦点,但没有成功: SendMessage(hDlgOptions, WM_NEXTDLGCTL, (W

我有一个选项对话框,旁边有一个TreeView和不同的面板,当我选择tree项时,我更改了它

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

我想把焦点放在树状视图中的第一个项目上,并将焦点放在第一个项目上

我尝试设置默认id:

SendMessage(hDlgOptions, DM_SETDEFID, IDC_TREE, 0);
我试图用NEXTDLGCTL设置焦点,但没有成功:

SendMessage(hDlgOptions, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlgOptions, IDC_TREE), TRUE);
我的第二个问题是当“选项”对话框显示面板已加载时窗口的动画。我想在第次动画表演后加载它

我为这一刻设定了一个计时器。。。也许你有更好的解决办法

非常感谢您的专家评审,我也会考虑所有优化代码的好主意

对话框加载

我想要什么

resource.rc

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
选项对话框

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

选项卡顺序由控件在rc文件中列出的顺序定义。动一下你的手

CONTROL         "",IDC_TREE,...
行是
开始之后的第一行


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

选项卡顺序由您的控件在rc文件中列出的顺序定义。动一下你的手

CONTROL         "",IDC_TREE,...
行是
开始之后的第一行


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

此代码不编译。请检查您的代码格式,您将了解原因。此代码无法编译。请检查您的代码格式,您将了解原因。