|
Hi
Thanks for your replies. I drew the controls with the MFC resource editor, so the scaling doesnt match as you said.
So, I started a Win32 desktop application from scratch without MFC or other wrappers. I will do all drawings and scalings myself for all elements. I hope this will solve my DPI problems. I know that this is much work, but I only have experience with VisualStudio and MFC and I have to learn the basic WIN32 stuff first. I wanted to know the underlying win32 basics anyway.
Thanks for your help!
regards
Erich
|
|
|
|
|
My "answer" was, why bother when the OS / framework will do it for you.
Besides dimensions, you have to scale positions (top, left), fonts, pixel fiddling.
With a "ViewBox" (as one example) one can do in 1 minute what you'll be spending the next month on.
Your graphics are "Border" elements within a Grid, inside a viewbox, with whatever relative dimensions you want.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
modified 24-Jan-20 14:34pm.
|
|
|
|
|
|
Hi,
I am covering a book tutorial about programming win32 and when I am compiling the code provided,
radio buttons doesn't show when are checked, instead the checkbox that is in the same dialog window
shows when it is checked.
I will attach the code if you can help me:
resource code:
TESTDIALOG DIALOG DISCARDABLE 20, 20, 180, 70
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Test Dialog"
FONT 8, "MS Sans Serif"
BEGIN
CHECKBOX "Check box control.",IDC_CHECKBOX,9,7,70,10
GROUPBOX "Radio Buttons",-1,7,21,86,39
RADIOBUTTON "First", IDC_RADIO1,13,32,37,10,WS_GROUP | WS_TABSTOP
RADIOBUTTON "Second",IDC_RADIO2,13,45,39,10
PUSHBUTTON "Done",IDCANCEL,116,8,50,14,WS_GROUP
END
cpp code:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case ID_FILE_TEST:
if ( !hDlgModeless )
hDlgModeless = CreateDialog( hInst, MAKEINTRESOURCE(32767),
hWnd, (DLGPROC)TestDlgProc );
break;
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
LRESULT CALLBACK TestDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
CheckDlgButton(hDlg,IDC_CHECKBOX, bChecked ? MF_CHECKED : MF_UNCHECKED);
CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO2,bRadio1 ? IDC_RADIO1 : IDC_RADIO2);
break;
case WM_COMMAND:
switch( LOWORD(wParam))
{
case IDC_CHECKBOX:
bChecked=!IsDlgButtonChecked(hDlg,IDC_CHECKBOX);
CheckDlgButton(hDlg,IDC_CHECKBOX, bChecked ? MF_CHECKED : MF_UNCHECKED);
break;
case IDC_RADIO1:
bRadio1=TRUE;
CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO2, IDC_RADIO1);
break;
case IDC_RADIO2:
bRadio1=FALSE;
CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO2,IDC_RADIO2);
break;
case IDCANCEL:
DestroyWindow(hDlg);
break;
}
break;
case WM_DESTROY:
hDlgModeless=NULL;
break;
default:
return (FALSE);
}
return (TRUE);
}
If it's need it I will put all the code.
Thank you in advance.
|
|
|
|
|
Did you debug this code?
Is this code:
case IDC_CHECKBOX:
bChecked=!IsDlgButtonChecked(hDlg,IDC_CHECKBOX);
CheckDlgButton(hDlg,IDC_CHECKBOX, bChecked ? MF_CHECKED : MF_UNCHECKED); executed?
Is this code:
case IDC_RADIO1:
bRadio1=TRUE;
CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO2, IDC_RADIO1);
break; executed?
|
|
|
|
|
Yes, I attached a link to the result, but how I sayed, when I check the radio box nothing happens:
Dialog-Box — imgbb.com[^]
The checkbox instead is ok:
Dialog-Box1 — imgbb.com[^]
[url=https://imgbb.com/][img]https://i.ibb.co/SBV51Bm/Dialog-Box1.jpg[/img][/url]
|
|
|
|
|
Again: did you set a break point to one of these lines:
<pre lang="c++"> case IDC_RADIO1:
bRadio1=TRUE;
CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO2, IDC_RADIO1);
break;
and was sure that this
CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO2, IDC_RADIO1);
has been executed?
|
|
|
|
|
Yes, I had placed a brakepoint after the CheckRadioButton RADIO1 function at the "break" statement.
When I press the Radio1 radio button the program goes and stops at the breakpoint, but what I had observed is that when a press play again to the compiler the program continues to execute and then it's comes back at the break point without to press again the radio button.
Thanks,
|
|
|
|
|
Check in Resource.h file to see if those two radio buttons has consecutive values ... might be a problem if they are not.
|
|
|
|
|
_Flaviu wrote:
Check in Resource.h file to see if those two radio buttons has consecutive values ... might be a problem if they are not. |
Yes, that it was, in the resource.h the values of the radio butons were reversed, first it was Radio2 then Radio1. I putted their correspondent values in increasing order and problem was solved.
Many thank Flaviu
|
|
|
|
|
You are welcome I am glad to help !
|
|
|
|
|
I just created a quick test with your code and it works fine. There must be something else happening that we cannot see. As suggested by Flaviu above, please check the defined values for the dialog buttons.
|
|
|
|
|
In addition what was said before, I suggest you add a default case for the inner switch in WM_COMMAND. Then set a breakpoint on that default. Maybe you're missing a case in that switch statement?
GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
|
|
|
|
|
I got a strange message from my compiler. Same code, same (at nearly) settings for Debug and Release versions. But what is more important, same files and same code! But when I try to create Release version, I get this:
Error CVT1100 duplicate resource. type:MANIFEST, name:1, language:0x0409 WTL3 C:\Users\Andrew\Documents\Visual Studio 2015\Projects\WarperPro\CVTRES 1
But Debug version can be created. Any ideas? I checked the project's settings and found nothing suspicious.
|
|
|
|
|
|
Check your Linker and Manifest settings in the project properties. It may be that you have a manifest reference in your resource file that should not be there, or is not being added correctly.
|
|
|
|
|
Thank you, your tip was useful. I checked all places in the project's settings where I met the word "manifest" and found one, where settings for Debug and Release were different. Release wanted to generate manifest file, but Debug did not. I excluded manifest generation for the Release version and finally got it.
|
|
|
|
|
Has happened to me more than once.
|
|
|
|
|
Look, guys, I have a code that worked properly under Windows XP 32 bit.
hHookMsg = SetWindowsHookEx(WH_JOURNALPLAYBACK, hkprc, hInst, 0). But under Windows 7 64 bit this call failed and I got System Error Message "Acces denied"
I tried this:
hHookMsg = SetWindowsHookEx(WH_JOURNALPLAYBACK, hkprc, hInst, GetCurrentThreadId())
and this
hHookMsg = SetWindowsHookEx(WH_JOURNALPLAYBACK, hkprc, (HINSTANCE)NULL, GetCurrentThreadId())
and got "This hook can be set only globally".
Any ideas how to resolve the situation?
|
|
|
|
|
They have put security around that sort of thing and you probably have to be running as administrator and it's likely going to throw a UAC to user to confirm it is okay. Goto MSDN and look at the documentation.
In vino veritas
|
|
|
|
|
Sure. I do not need this option- it was intended to demonstrate how my prog works to another users. And they do no not like (and for a reason) when some soft wants administrative privileges.
|
|
|
|
|
Member 14105155 wrote: And they do no not like (and for a reason) when some soft wants administrative privileges. Well they are going to have to get used to it. Windows 10 (7 is out of support in a few days) uses this extensively in order to protect the users' systems from malicious software.
|
|
|
|
|
Well, this is the reason to write soft that works without such privileges.
|
|
|
|
|
You do not have a choice. The operating system sets the rules, and your software must work within those rules.
|
|
|
|
|
I do have. A program can ask a user if he let it run with privileges, but users dislike such soft. Therefore, the choice exists, but it is very poor one.
|
|
|
|
|