我在安装程序,正在安装我的程序。
我想问用户是要创建桌面快捷方式还是在启动时运行程序。 为了使他能够在启动程序时运行或创建桌面快捷方式,他需要选中相应的复选框。
我的程序调试良好,没有错误,但是我有一个问题。
始终创建桌面快捷方式和RunAtStartup函数,我不知道如何检查按钮是否处于选中状态。
有没有办法检查按钮是否被选中?
这是我的代码:
LRESULT CALLBACK WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
case WM_COMMAND: {
// Buttons Check
if (wparam == IDC_BUTTON1)
{
BOOL checked = IsDlgButtonChecked(hwnd, IDC_BUTTON1);
if (checked) {
CheckDlgButton(hwnd, IDC_BUTTON1, BST_UNCHECKED);
}
else {
CheckDlgButton(hwnd, IDC_BUTTON1, BST_CHECKED);
}
}
if (wparam == IDC_BUTTON3)
{
BOOL checked = IsDlgButtonChecked(hwnd, IDC_BUTTON3);
if (checked) {
CheckDlgButton(hwnd, IDC_BUTTON3, BST_UNCHECKED);
}
else {
CheckDlgButton(hwnd, IDC_BUTTON3, BST_CHECKED);
}
}
// Install Part
switch (wparam)
{
case IDC_BUTTON2:
Start_Install(hwnd, wparam);
if (IDC_BUTTON1 == IsDlgButtonChecked(hwnd, IDC_BUTTON1)) {
}
else {
Sleep(5000);
link();
}
if (IDC_BUTTON3 == IsDlgButtonChecked(hwnd, IDC_BUTTON3)) {
}
else {
Sleep(5000);
RunStartup();
}
Sleep(5000);
PostQuitMessage(0);
break;
}
}
}
这只是安装,如果您需要完整的代码,请提出要求,我将进行编辑。
答案 0 :(得分:0)
我之所以发布此答案,是因为尽管我的简短评论似乎解决了OP的问题,但我现在意识到“解决方案”是不正确的:原因是我(错误地)认为IsDlgButtonChecked()
函数返回BOOL
值,指示该按钮是“选中”(= TRUE
)还是“未选中”(= {FALSE
)。
但是,这不是 情况,如the M/S documentation所示-实际上,它返回的UINT
可以具有 三个 值:BST_UNCHECKED
(= 0),BST_CHECKED
(= 1)或BST_INDETERMINATE
(= 2)。因此,在按钮具有“不确定”状态(在这种情况下意味着什么)的异常/不太可能的事件中,我的“快速解决方案”可能会失败。
我还注意到在OP的代码中,对wparam
的值进行了不必要的/多余的检查-在给定函数的过程中,该值不会更改。 if (wparam == ...
检查和随后的switch(wparam) ...
块的混合可以大大简化为一个单独的switch
,如下所示(还请注意IsDlgButtonChecked
结果的“校正”测试) :
LRESULT CALLBACK WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
BOOL checked;
LRESULT answer = DefWndProc(hwnd, msg, wparam, lparam); // Or something similar
switch (msg)
{
case WM_COMMAND: {
switch (wparam)
{
// Buttons Check
case IDC_BUTTON1:
checked = IsDlgButtonChecked(hwnd, IDC_BUTTON1);
if (checked == BST_CHECKED) CheckDlgButton(hwnd, IDC_BUTTON1, BST_UNCHECKED);
else CheckDlgButton(hwnd, IDC_BUTTON1, BST_CHECKED);
break;
case IDC_BUTTON3:
checked = IsDlgButtonChecked(hwnd, IDC_BUTTON3);
if (checked == BST_CHECKED) CheckDlgButton(hwnd, IDC_BUTTON3, BST_UNCHECKED);
else CheckDlgButton(hwnd, IDC_BUTTON3, BST_CHECKED);
break;
// Install Part
case IDC_BUTTON2:
Start_Install(hwnd, wparam);
if (IDC_BUTTON1 == IsDlgButtonChecked(hwnd, IDC_BUTTON1) == BST_CHECKED) {
//..
}
else {
Sleep(5000);
link();
}
if (IsDlgButtonChecked(hwnd, IDC_BUTTON3) == BST_CHECKED) {
//..
}
else {
Sleep(5000);
RunStartup();
}
Sleep(5000);
PostQuitMessage(0);
break;
}
}
}
return answer; // Need to set "answer" accordingly, probably dependent on the actions taken in the SWITCH block(s)
}