I've got a dialog with a tab control. I fill each tab using a dialog resource. When I have another window in front of my app, clicking the blank space within the dialog (or any labels) won't bring it back to the top. It only becomes active again if I click on the title bar or a control (edit, combo box, anything). Any ideas why it would behave that way?
some of the code that might be relevant:
Code:
DLG_RENEGADEX DIALOGEX 4,4,400,275
CAPTION PROGRAM_NAME
FONT 10,"MS Sans Serif",400,0,0
STYLE WS_VISIBLE|WS_OVERLAPPEDWINDOW|DS_CENTER
BEGIN
CONTROL "",TAB_MAIN,"SysTabControl32",WS_CHILD|WS_VISIBLE|WS_TABSTOP|TCS_FOCUSNEVER,0,0,400,268
END
DLG_HOOK DIALOGEX MOVEABLE PURE LOADONCALL DISCARDABLE 5,5,396,262
FONT 10,"MS Sans Serif",0,0,0
STYLE 0x0004 | WS_CHILD
BEGIN
CONTROL "",LSV_HOOK_PROCESSES,"SysListView32",WS_CHILD|WS_VISIBLE|WS_TABSTOP|LVS_REPORT|LVS_SINGLESEL,7,24,143,218,WS_EX_CLIENTEDGE
CONTROL "",CMB_HOOK_PRESETS,"ComboBox",WS_CHILD|WS_VISIBLE|WS_TABSTOP|CBS_HASSTRINGS|CBS_DROPDOWNLIST,226,27,117,137
Code:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
INITCOMMONCONTROLSEX blah;
blah.dwSize = sizeof(INITCOMMONCONTROLSEX);
blah.dwICC = -1;
InitCommonControlsEx(&blah);
hinstMain = hInstance;
hwndMain = CreateDialog(hInstance,MAKEINTRESOURCE(DLG_RENEGADEX),HWND_DESKTOP,MainProc);
sprintf(ErrTxt, "%u", GetLastError());
if (!hwndMain) { MessageBox(NULL,ErrTxt, "debug",MB_OK); }
if (!hwndMain) return FALSE;
ShowWindow(hwndMain, nCmdShow);
UpdateWindow(hwndMain);
MSG msg;
// HACCEL AccelMain = LoadAccelerators(hinstMain, "MainAccel");
while(GetMessage(&msg, NULL, 0, 0))
{
//msg.hwnd could determine which procedure to translate accelerator for.
// if (!TranslateAccelerator(hwndMain, AccelMain, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
// }
}
return (int)msg.wParam;
}
BOOL CALLBACK MainProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
HWND hTabCtrl = GetDlgItem(hwnd, TAB_MAIN);
switch(Message)
{
case WM_INITDIALOG:
{
memset(&HookedProcess, 0, sizeof(PROCESS_INFORMATION));
LoadSettings();
InitTabControl(hwnd, lParam);
} break;
case WM_NOTIFY:
{
NMHDR *hdr = (LPNMHDR)lParam;
if (hdr->code == TCN_SELCHANGING || hdr->code == TCN_SELCHANGE)
{
int index = TabCtrl_GetCurSel(hdr->hwndFrom);
if (index >= 0 && index < NUM_TABS) ShowWindow(hTabDlgs[index], (hdr->code == TCN_SELCHANGE) ? SW_SHOW : SW_HIDE);
}
} break;
case WM_CLOSE:
{
// Free........();
if (HookedProcess.hProcess) {
CloseHandle(HookedProcess.hProcess);
CloseHandle(HookedProcess.hThread);
}
DestroyWindow(hwnd);
} break;
case WM_DESTROY:
{
PostQuitMessage(0);
} return 0;
default:
return FALSE;
// return DefWindowProc(hwnd, Message, wParam, lParam);
}
// return 0;
return DefWindowProc(hwnd, Message, wParam, lParam);
//return 0 and default to DefWindowProc?
}
/***************************************************
Tab control
****************************************************/
int InitTabControl(HWND hwnd, LPARAM lParam)
{
TCITEM tabitem;
HWND hTab;
hTab = GetDlgItem(hwnd, TAB_MAIN);
memset(&tabitem, 0, sizeof(tabitem));
tabitem.mask = TCIF_TEXT;
tabitem.cchTextMax = MAX_PATH;
tabitem.pszText = "Hook";
SendMessage(hTab, TCM_INSERTITEM, HOOK_TAB, (LPARAM)&tabitem);
tabitem.pszText = "Search";
SendMessage(hTab, TCM_INSERTITEM, CODE_SEARCH_TAB, (LPARAM)&tabitem);
tabitem.pszText = "Settings";
SendMessage(hTab, TCM_INSERTITEM, SETTINGS_TAB, (LPARAM)&tabitem);
// Get the position that the dialogs should be displayed
RECT rt,itemrt;
// GetWindowRect(GetDlgItem(hwnd, LBL_TAB), &rt);
GetWindowRect(hTab, &rt);
TabCtrl_GetItemRect(hTab,1,&itemrt);
rt.top -= (itemrt.top - itemrt.bottom);
rt.bottom -= rt.top;
rt.right -= rt.left;
ScreenToClient(hTab, (LPPOINT)&rt);
// Create the dialogs modelessly and move them appropriately
hTabDlgs[HOOK_TAB] = CreateDialog((HINSTANCE)lParam, (LPSTR)DLG_HOOK, hTab, (DLGPROC)HookProc);
hTabDlgs[CODE_SEARCH_TAB] = CreateDialog((HINSTANCE)lParam, (LPSTR)DLG_CODE_SEARCH, hTab, (DLGPROC)CodeSearchProc);
hTabDlgs[SETTINGS_TAB] = CreateDialog((HINSTANCE)lParam, (LPSTR)DLG_SETTINGS, hTab, (DLGPROC)OptionsProc);
MoveWindow(hTabDlgs[HOOK_TAB], rt.left, rt.top, rt.right, rt.bottom, 0);
MoveWindow(hTabDlgs[CODE_SEARCH_TAB], rt.left, rt.top, rt.right, rt.bottom, 0);
MoveWindow(hTabDlgs[SETTINGS_TAB], rt.left, rt.top, rt.right, rt.bottom, 0);
// Show the default dialog
ShowWindow(hTabDlgs[HOOK_TAB], SW_SHOW);
return 0;
}