标签: win32gui

如何在 win32/mfc 应用程序中隐藏/折叠主菜单

我一直对如何实现这一点感兴趣(使用 alt 键隐藏/显示主菜单),现在一些应用程序经常这样做。真正令我满意的是带有此插件的 Visual Studio 2010: http://visualstudiogallery.msdn.microsoft.com/bdbcffca-32a6-4034-8e89-c31b86ad4813 ?SRC=VSIDE

(firefox也这样做,但我认为这是以不同的方式)

任何人都可以向我解释如何实现这一点,或者如果您知道任何演示这一点的示例项目,请告诉我。

(我在堆栈中的一些回复中看到的是,我们必须在隐藏菜单时销毁菜单并在显示菜单时创建菜单?!但这似乎是一个有点糟糕的解决方案......)

谢谢

c++ menu win32gui hide

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

复选框更改文本颜色

背景改变了,但文字颜色没有改变.我的代码:

case WM_CTLCOLORSTATIC:
{
    DWORD CtrlID = GetDlgCtrlID((HWND)lParam); //Window Control ID

    if(CtrlID == IDC_CHECK_CHAT)
    {
        HDC hdcStatic = (HDC) wParam;
        SetTextColor(hdcStatic, RGB(255,255,255));
        SetBkColor(hdcStatic, RGB(70,70,70));
        return (INT_PTR)hBrush;
    }
}
Run Code Online (Sandbox Code Playgroud)

资源文件:

CONTROL         "Blah Blah Blah",IDC_CHECK_CHAT,
                "Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,72,137,10
Run Code Online (Sandbox Code Playgroud)

c++ winapi win32gui

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

导入BitMap使我的窗口滞后

我需要一些帮助.

我将一个位图导入我的Win32窗口.我正在构建它,几秒钟后它开始滞后很多.我不知道为什么,但我想我使用它后没有正确地从内存中删除它.

提前感谢您的帮助.

我在测试时看到了一种行为.如果我没有移动窗口而不是移动窗口,但移动它后它开始滞后并阻止我的IDE.也许是WM_PAINT的东西?这是我的代码.

#include <windows.h>

//For more makros
#include <windowsx.h>
#include "Simulatron.h"




HINSTANCE hProgramInstance;
Simulatron Exo;

char Simulatron::m_szClassName[] = "Simulatron";



Simulatron::Simulatron(HINSTANCE hInstance)
{
    m_hInstance = hInstance; // Save Instance handle
    m_wndClass.cbSize = sizeof(WNDCLASSEX); // Must always be sizeof(WNDCLASSEX)
    m_wndClass.style = CS_DBLCLKS; // Class styles  
    m_wndClass.lpfnWndProc = MainWndProc; // Pointer to callback procedure
    m_wndClass.cbClsExtra = 0; // Extra bytes to allocate following the wndclassex structure
    m_wndClass.cbWndExtra = 0; // Extra bytes to allocate following an instance of the structure
    m_wndClass.hInstance …
Run Code Online (Sandbox Code Playgroud)

c++ winapi bitmap win32gui

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

如何在C++ Win32 GUI中为文本框设置默认背景(灰色)文本?

创建文本框时

hwnd = CreateWindowEx(0, "EDIT", [...])
Run Code Online (Sandbox Code Playgroud)

如何在该框的背景上设置默认的灰色文本,在提供一些输入时会消失?一个例子.我正在使用代码块.

编辑:

#include <commctrl.h>

[...]

HWND hwndEdit = CreateWindowEx(0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 10, 110, 300, 20, hwnd, NULL, hThisInstance, NULL);
SendMessage(hwndEdit, EM_SETCUEBANNER, FALSE, (LPARAM) L"Default text");
Run Code Online (Sandbox Code Playgroud)

c++ winapi textbox win32gui

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

如何实现Win32 API GetMessage()的"阻塞"行为?

根据这里,GetMessage()是一个阻塞调用,直到可以从消息队列中检索到消息时才会返回.

那么,这种阻止行为是如何实现的呢?

是否GetMessage()使用某种自旋锁,以便UI线程只是忙等待消息队列中出现的新消息?如果是这样,我想至少有一个CPU核心应该在UI应用程序运行时具有很高的使用率.但我没有看到这种情况发生.那么它是怎样工作的?

添加1

感谢评论中的提示.自旋锁意味着降低线程上下文切换的成本.它不应该在这里使用.我也想过这里可能会使用一些事件范例.但如果它是事件驱动的,那么这个事件模型是如何工作的?

我的猜测是这样的:

  • 定期引发输入检查事件.也许通过一些硬件定时器中断.然后定时器中断处理程序将检查输入事件的各种输入设备缓冲区.然后根据当前桌面上下文将其放入某个应用程序的消息队列中,例如哪个是活动窗口.

我想其他一些东西也可能基于定时器中断,例如线程上下文切换.

添加2

根据目前为止的答复.UI线程等待一些事件对象.但是由于UI线程在等待某些东西,它不活跃,并且它本身无法做任何事情.事件对象只是一些被动状态信息.因此,必须有其他人在事件状态更改时唤醒线程.我认为它应该是线程调度程序.并且线程调度可以由定时器中断脉冲.

线程调度程序将定期检查事件状态并唤醒线程并根据需要将消息放入其队列中.

我对整个情况是否正确?

添加3

还有一个问题是:谁修改了事件对象的状态?基于此处,事件似乎只是一些可由任何活动修改的数据结构.我认为线程调度程序只是使用线程和事件之间的关系来决定运行哪个线程.

当一个线程被安排运行时,它的所有要求都应该已经完成​​.诸如消息应该它等待的事件被引发之前被放入其队列中.这是合理的,否则可能为时已晚.(感谢RbMm的评论.)

添加4

在JDK中,LinkedBlockingDeque类型也为该take()方法提供了类似的阻塞行为.

检索并删除此双端队列表示的队列的头部(换句话说,此双端队列的第一个元素),必要时等待,直到元素可用.

.NET对应的是BlockingCollection <T>类型.一个讨论它的线程.

这是一个关于如何在C#中实现阻塞队列的线程.

winapi message-queue win32gui

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

基于Win32的应用程序,尝试更新标签的文本

此代码显示一个带有文本标签的窗口,上面写着:"请输入一个数字"和一个按钮.

单击按钮时,应将文本替换为"TEXT".它可以工作,但它会在第一个文本的顶部写入/打印新文本.所以它的重叠.

我想要更改文本字符串而不是写第一个,但我不知道我是如何对Windows应用程序开发的新手.

请帮帮我们.

整个来源是:

#include <windows.h>
#include <iostream>


using namespace std;


enum { ID_LABEL = 1,ID_BUTTON0};

static  HWND static_label, button0;

HDC          hdc;
HBRUSH  NewBrush;
HINSTANCE g_hInst;


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    LPCTSTR className = TEXT("myClass");
    WNDCLASSEX wc;

    wc.cbSize        = sizeof(wc);
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.cbWndExtra    = 0;
    wc.cbClsExtra    = 0;
    wc.lpfnWndProc   = WndProc;
    wc.hInstance     = hInstance;
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = TEXT("myClass"); …
Run Code Online (Sandbox Code Playgroud)

c++ winapi win32gui

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

如何捕获CTRL +空格键+空格键

我将如何捕获按下“ Ctrl +空格+空格”的用户!

我使用以下代码成功测试了“ Ctrl +空格”:

RegisterHotKey(0, 1, MOD_CONTROL, VK_SPACE);
Run Code Online (Sandbox Code Playgroud)

c++ win32gui

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

选项卡控件:如何防止选择更改?

我的项目是带有选项卡控件的简单WIN32对话框。在某些情况下,我想阻止用户更改选项卡。MS文档非常简单 -

返回 TRUE 以防止更改选择,或返回 FALSE 以允许更改选择。

然而,这根本行不通!

代码:

	case WM_NOTIFY:
		if (((LPNMHDR)lParam)->idFrom == IDC_DEVTABS)
		{
			if (((LPNMHDR)lParam)->code == TCN_SELCHANGING)
				return  (INT_PTR)TRUE;
				//return  (INT_PTR)OnSelChanging(hDlgTab);
			if (((LPNMHDR)lParam)->code == TCN_SELCHANGE)
				OnSelChanged(hDlgTab);
				
			return  (INT_PTR)TRUE;			
		}
Run Code Online (Sandbox Code Playgroud)

我可以看到我的父对话框收到了消息,但选项卡无论如何都在改变。知道如何防止选项卡更改吗?

c++ winapi tabs tabcontrol win32gui

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

ue4是用Qt做的吗?

虚幻引擎 4 是一款很棒的软件。我想知道是否有人知道 GUI 编辑器是如何创建的。他们使用的是基于 Windows 的自己的技术(尽管我对此表示怀疑)还是基于其他技术?或者他们是用 Qt 或其他库构建的?这个问题让我一直想知道,我在网上找不到很多信息。提前致谢!

qt win32gui qtgui unreal-engine4

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

SetForegroundWindow() 在服务器的 RDP 窗口最小化或锁定时不运行

我正在从事一个自动化项目,该项目要求我搜索 acrobat 进程,然后将其置于前台。我使用的是 Windows Server 2012 R2 Standard 和 Python。我在进程列表中搜索该特定 PDF 文件,然后尝试将该窗口置于前台。

当服务器打开并处于活动状态时,我的代码运行良好。一旦它被最小化或锁定,它就不起作用。具体来说,SetForegroundWindow() 行不起作用并抛出错误“(0, 'SetForegroundWindow', 'No error message is available')”。

接下来,我浏览了此处列出的许多示例,有人建议在该行之前使用“Alt”选项卡。试过了,没用。然后我根据另一个用户使用 ShowWindow() 但又出现了同样的错误。现在,我完全被困住了。

我已经查看了许多与该问题相关的线程,例如: 1. SetForegroundWindow 不适用于最小化进程 2.最小化时前移窗口 3.最小化时前移窗口

我试过 MainWindowHandle 可以修复错误,但我无法在 python 中实现它。

另外,我安装了 pywinauto 并使用了 pywinauto 的 findwindows 和 SetForegroundWindow 功能。当服务器处于活动状态时它运行良好,但是一旦我们最小化或锁定服务器,它就不起作用并给出相同的错误“(0, 'SetForegroundWindow', 'No error message is available')”。

现在,我完全没有选择。任何想法/建议?

这是片段:

import win32gui,win32con
import win32com.client
import time

time.sleep(3)
def windowEnumerationHandler(hwnd, top_windows):
    if win32gui.IsWindowVisible(hwnd) and win32gui.GetWindowText(hwnd)!='':
        top_windows.append((hwnd, win32gui.GetWindowText(hwnd)))

results = []
top_windows = []
file_name_of_pdf = "ARW_AR_2016.pdf"
win32gui.EnumWindows(windowEnumerationHandler, …
Run Code Online (Sandbox Code Playgroud)

python window win32gui pywinauto setforegroundwindow

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

Gif闪烁

我正在用c ++ win32 api制作一个窗口。我正在使用gdi +显示gif。并且此gif从资源加载并生成IStream *。但是,当我不使用gif的路径,并使用IStream创建GDIPlus :: Image并将其显示时,gif开始闪烁。PS窗口为SW_SHOWMAXIMIZED

我试图在WM_ERASEBKGND消息中返回1,使得NULL WNDCLASSEX.hbrBackGround,使用InvalidateRect(hwnd,&rc,FALSE)PS rc是

RECT rc;
GetWindowRect(hwnd,&rc);
Run Code Online (Sandbox Code Playgroud)

但这没有用;

case WM_TIMER:
        if (wParam == DRAW_ANIM)
        {
            pImg->SelectActiveFrame(&FrameDimensionTime, nFrm);
            const Rect DRC(0, 0, pImg->GetWidth(), pImg->GetHeight());
            pGphcs->Clear(Color(128, 128, 128));

            pGphcs->DrawImage(pImg, DRC);
            RECT rt;
            GetWindowRect(hwnd, &rt);
            InvalidateRect(hwnd, &rt, FALSE);


            if (nFrm < (nFrmCnt - 1)) nFrm++; else nFrm = 0;

            InvalidateRect(hwnd, &rt, FALSE);
        }

        break;

hMWDC = GetDC(hWnd);
    pGphcs = new Graphics(hMWDC);

    HMODULE hMod = GetModuleHandle(NULL);
    HRSRC hRes = FindResource(hMod, MAKEINTRESOURCEW(MY_GIF_ID), RT_RCDATA);
    if (!hRes) MessageBox(NULL, L"hRes!!", L"ERROR", …
Run Code Online (Sandbox Code Playgroud)

c++ winapi gdi+ animated-gif win32gui

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

是否可以在 python 3.8 中使用 win32 来按下键盘上的按键

我创建了一个使用 pydirectinput 按下键盘上的某些键的应用程序。问题是 pydirectinput 有点慢,而我的应用程序需要很快。有谁知道如何使用 win32 进行按键操作,如果是的话,您能告诉我如何下载和安装它,以及如何使用它来按键盘上的某些键。我正在使用 python 3.8。谢谢

python winapi pywin32 win32gui win32com

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

Win32 - 无法使用RedrawWindow()触发WM_PAINT消息

我试图从WM_TIMER触发WM_PAINT消息; 计时器工作,但RedrawWindow()函数似乎没有做任何事情.我究竟做错了什么?

这是我的回调函数:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    PAINTSTRUCT Ps;
    COLORREF    clrBlue = RGB(25, 55, 200);
    RECT        Recto = { 20, 28, 188, 128 };
    COLORREF    clrAqua = RGB(128, 255, 255);
    COLORREF clrRed  = RGB(255, 25, 5);
    static bool x = true;
    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); …
Run Code Online (Sandbox Code Playgroud)

c++ winapi win32gui

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