C 带有树状视图和面板内存对话框的首选项对话框
我有一个选项对话框,旁边有一个TreeView和不同的面板,当我选择tree项时,我更改了它 我的第一个问题是,当选项对话框加载时,焦点被设置为默认按钮,即使我删除了它 我想把焦点放在树状视图中的第一个项目上,并将焦点放在第一个项目上 我尝试设置默认id: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
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,...
行是开始之后的第一行
我不知道你在说什么动画。如果有一个特定的时间间隔,定时器是一种正常的延迟方式。如果您只是想将树控件的初始化推迟到创建和显示所有内容之后,我将发布一些命令消息,并在其处理程序中执行所有操作。此代码不编译。请检查您的代码格式,您将了解原因。此代码无法编译。请检查您的代码格式,您将了解原因。