-
Tab order again
I'm having trouble with tabs in one of my projects.
I've set the tab order, and I'm using the IsDialogMessage() function in the messageloop, still the tabstops don't work..
I tried to hav a messageloop in another form, and it worked.
Is this the solution? Should there be one message loops for every form?
-
Is the dialog box modal or modeless? Show us the excerpt from the resource file that defines it.
-
Resource script for main form, this is the form with the message loop.
Code:
FRM_MAIN DIALOG DISCARDABLE 0, 0, 186, 134
STYLE DS_SETFOREGROUND | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX |
WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "Dialog"
FONT 8, "MS Sans Serif"
BEGIN
CONTROL "List2",LIST1,"SysListView32",LVS_REPORT | WS_BORDER |
WS_TABSTOP,0,0,186,121
END
One of the child forms, without message loop:
Code:
FRM_SETUP DIALOGEX 0, 0, 258, 175
STYLE DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_TOOLWINDOW
FONT 8, "MS Sans Serif"
BEGIN
CONTROL "List1",LIST1,"SysListView32",LVS_LIST | LVS_SINGLESEL |
LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER |
WS_BORDER | WS_TABSTOP,3,4,43,153
PUSHBUTTON "&Lagre",CMD_OK,97,159,31,14
PUSHBUTTON "&Avbryt",CMD_CANCEL,130,159,31,14
END
Could the problem be something with the parent/child hierarchy? ie. all the forms have to be the child of the mainform?
EDIT:
The dialogboxes are modeless.
-
You have one dialog box as the child of the main window, and then another dialog box as a child of the first dialog box? For modeless dialog boxes, the messages are sent to its owner, that's why you have to include the IsDialogMessage() call within the message loop of the dialog box's parent. Do you do this for BOTH dialog boxes? Do both dialog boxes work by themselves (i.e. when each is just as a child from the main window, with no other dialog box). Do both dialog boxes NOT work currently? (i.e. are you having problems with both of them, or just one of them)?
-
The main window and all the other windows are dialogs.
The other windows in the app are dialogs too(children/grandchildren)
Tabs don't work in any of the dialogs.
The app has a message loop in the main form, but i tried to create one in another form. Tabs then worked in this form, but not in it's children(a setup form with other dialogs as "tabstrips")
-
I didn't realize the main window was a dialog box, itself. The IsDialogMessage() function processes messages for dialog boxes by converting keyboard messages into selection commands for that particular dialog box. Obviously, this is not being run when it should. How is the message loop being run continuously to allow for these conversions to take place on any keyboard command, as it would in a normal main window?
-
Then maybe i should read some more Windowsprogramming...I thought you could use dialogs all over..
Anyway, here's some of the code from the mainform:
Code:
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int iShow){
MSG msg;
hInstMain=hThisInstance;
hWndMain = CreateDialog(hThisInstance, MAKEINTRESOURCE(FRM_MAIN), HWND_DESKTOP, DialogProc);
while (GetMessage(&msg, NULL, 0, 0) > 0) {
if(!IsDialogMessage(hWndMain, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return(0);
}
BOOL CALLBACK DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
static bool inTray(false); // If in systray or not
HMENU mPopup; // Popupmenu for systray
char chRet(0);// return from dialogproc
POINT p1; // Mousecoords
RECT r1; // Rectangle for WM_SIZE
switch(uMsg){
case WM_INITDIALOG:
hWndMain=hwnd;
SetClassLong(hWndMain, GCL_HICON, (long)LoadImage(hInstMain, MAKEINTRESOURCE(IDI_ICON_1), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE));
if(!InitForm())
DestroyWindow(hWndMain);
ShowWindow(hWndMain, SW_SHOW);
chRet=0;
break;
case WM_COMMAND:
switch(LOWORD(wParam)){
case MNU_FILE_CFG: // Setupmenu
frmSetup(&hInstMain, hWndMain, &ThD);
break;
case MNU_FILE_QUIT:
SendMessage(hWndMain, WM_CLOSE, 0, 0);
break;
case MNU_TOOLS_CUST:
frmToolsCust(&hInstMain, hWndMain, &ThD);
break;
case MNU_TOOLS_PROD:
frmToolsProd(&hInstMain, hWndMain, &ThD);
break;
case MNU_TOOLS_TRANS:
frmToolsTrans(&hInstMain, hWndMain, &ThD);
break;
case MNU_TOOLS_FIRM:
frmToolsFirm(&hInstMain, hWndMain, &ThD);
break;
case MNU_HLP_ABOUT:
frmAbout(&hInstMain, hWndMain);
break;
}
SetTxt(hWndMain, "Windowtest");
break;
case WM_SIZE:
if(wParam==SIZE_MINIMIZED && ThD.bToTray){
sysTrayAdd(hWndMain, LoadIcon(hInstMain, MAKEINTRESOURCE(IDI_ICON_DD)), "Testapp");
ShowWindow(hWndMain, SW_HIDE);
inTray = true;
}else{
GetClientRect(hWndMain, &r1);
MoveWindow(ThD.hWndLst, 1, 1, r1.right-1, r1.bottom-1, TRUE);
}
break;
case WM_ICONNOTIFY:
switch(lParam){
case WM_RBUTTONUP:
SetForegroundWindow(hWndMain);
GetCursorPos(&p1);
mPopup = CreatePopupMenu();
AppendMenu(mPopup, MF_STRING|MF_ENABLED, 1, "&Config");
AppendMenu(mPopup, MF_SEPARATOR, 0, 0);
AppendMenu(mPopup, MF_STRING|MF_ENABLED, 3, "&End");
switch(TrackPopupMenu(mPopup ,TPM_RIGHTALIGN|TPM_LEFTBUTTON|TPM_RETURNCMD, p1.x, p1.y,0, hWndMain , NULL)){
case 1:// Config
EnableWindow(hWndMain, FALSE);
frmSetup(&hInstMain, hWndMain, &ThD);
EnableWindow(hWndMain, TRUE);
break;
case 3:// End
SendMessage(hWndMain, WM_CLOSE, 0, 0); break;
}
break;
case WM_LBUTTONDBLCLK:
SetForegroundWindow(hWndMain);
sysTrayRemove();
inTray = false;
ShowWindow(hWndMain, SW_SHOWNORMAL);
break;
}
break;
case WM_CLOSE: // Close request
return(b(hwnd, "Exit program?", "Windowtest", MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2)!=IDYES?
-1:DestroyWindow(hWndMain));
case WM_DESTROY: // Unload
ThD.db->Close();
ReleaseMutex(ThD.mtDb);
if(inTray == true)
sysTrayRemove();
PostQuitMessage(0);
break;
}
return(chRet);
}
Am i supposed to create the mainwindow through WinAPI?
-
Quote:
Originally posted by knutso
Code:
while (GetMessage(&msg, NULL, 0, 0) > 0) {
if(!IsDialogMessage(hWndMain, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
From MSDN IsDialogMessage Function:
The IsDialogMessage function determines whether a message is intended for the specified dialog box and, if it is, processes the message.
If this is the only messge loop in your program, the only dialog box you are testing for keyboard navigation and other dialog box functionality is the hWndMain dialog box. I would assume that this means this dialog box is working properly, and the rest are not.
-
Of course!!
I've done this before, in one of my other projects...I guess my brain has been disconnected for a while..
Anyway: I inserted a few message loops, and everything now works as intended.
Thanks for bearing with my stupid,simple questions, JasonD
-
Not a problem. The questions weren't stupid, and we all learn from trying to solve each other's problems.