小编ble*_*jzz的帖子

ownerdrawn复选框

我有一个原生的win32 c ++应用程序,里面有一个复选框.我想替换复选框并创建具有2个状态的ON/OFF切换按钮(就像复选框一样).我已将BS_OWNERDRAW样式添加到复选框并将其绘制到窗口中WM_DRAWITEM.问题是,当我点击复选框时,我收到一条WM_COMMAND消息(就像没有BS_OWNERDRAW),但CHECKED状态不会自动改变.我是否必须实现此功能,或者我错过了什么?

处理单击复选框的代码:

 case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);

    switch (wmId)
    {
        case IDC_CHECKBOX:
            if(wmEvent == BN_CLICKED)
            {
                dwPos = SendMessage(checkBox, BM_GETCHECK, 0, 0);
                if(dwPos == BST_CHECKED ) 
                {
                   // do some stuff

                } else if(dwPos == BST_UNCHECKED) {
                    // do some stuff
                }
           }
Run Code Online (Sandbox Code Playgroud)

问题是每次我点击复选框BM_GETCHECK都会返回BST_UNCHECKED.如果我删除BS_OWNERDRAW它工作正常.

创建按钮/复选框的代码:

   checkBox = CreateWindowEx(
        0,
        WC_BUTTON,
        szBuffer,
        WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_OWNERDRAW,
        BUTTON_ON_OFF_X, BUTTON_ON_OFF_Y,
        BUTTON_ON_OFF_WIDTH, BUTTON_ON_OFF_HEIGHT,
        hWnd, 
        (HMENU)IDC_CHECKBOX,
        hInst,
        NULL
   );
Run Code Online (Sandbox Code Playgroud)

c++ checkbox winapi ownerdrawn

3
推荐指数
1
解决办法
7029
查看次数

Windows系统托盘应用程序,如卷应用程序

我想创建一个非常类似于位于系统托盘中的Windows 7音量栏的应用程序.我是Windows开发的新手,想要一个正确的方向.

  • 我应该只是制作一个正常的应用程序,只需放入系统托盘?
  • 我不需要应用程序的主窗口,它只能通过系统托盘访问(我只需要音量栏,没有别的)...我怎么能这样做?
  • 用C++而不是C#编写它会更好吗?
  • 如何检测窗口输出的声音的"音量"(即使系统声音静音)?

谢谢你的回复.

c# system-tray windows-applications

2
推荐指数
1
解决办法
1346
查看次数

c ++ win32复选框列表 - 多项选择

我想在我的win32应用程序中添加一个复选框列表,因为我需要一个具有多个选择的控制元素.我搜索了msdn文档,并在本文中找到了我需要的内容:https://msdn.microsoft.com/en-us/library/windows/desktop/dn742407.aspx.但我找不到任何与之相关的代码.这是一个特殊的控制元素吗?或者这只是一个填充复选框的列表视图?或者这是组合框控件的特殊风格?如果有人可以提供示例或提供控件文档的链接,将不胜感激.

c++ winapi listbox multiple-select

2
推荐指数
1
解决办法
2903
查看次数

切换NotifyIcon上的表单可见性单击并在其他位置单击时隐藏它

我有一个在系统托盘中的应用程序.我想让用户点击它时可见notifyIcon,如果它已经不可见.如果它已经可见,则应该隐藏它.此外,当用户单击除表单上的其他任何地方时,表单应隐藏(如果它可见).

我的代码看起来像这样:

protected override void OnDeactivated(EventArgs e)
{
    showForm(false);
}

public void showForm(bool show)
{
    if(show)
    {
        Show();
        Activate();
        WindowState = FormWindowState.Normal;
    }
    else
    {
        Hide();
        WindowState = FormWindowState.Minimized;
    }
}

private void notifyIcon1_MouseClicked(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        if (WindowState != FormWindowState.Normal)
        {
            showForm(true);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

代码的问题是onDeactivated在点击调用之前调用,它隐藏表单而notifyIcon1_MouseClicked不是重新显示它.如果我能够检测到焦点是否由于点击notifyIcon或其他原因而丢失,则可以解决问题.

我已经完成了我的研究并发现了一个类似的线程,但是当onDeactivated被调用时,只有当鼠标位置在托盘上时才检测到解决方案:通过单击NotifyIcon(任务栏图标)来切换C#窗口

更新:我发布的解决方案只检测用户的鼠标是否位于任务栏中的托盘图标上,因此如果您点击任何其他托盘,该onDeactivated事件将不会被触发.我想获得与系统卷应用程序相同的功能.

c# windows notifyicon winforms

1
推荐指数
1
解决办法
7239
查看次数