注册 登录
编程论坛 C++教室

关于C++ Win32窗口应用程序的一个问题,求求各位大佬进来看下

Escapist 发布于 2020-06-01 20:29, 2746 次点击
我用CreateWindowExA创建了一个按钮(Button)/标签(Static)控件,
需要:当我的鼠标左键在这个控件上按下,就开始执行一段代码(此时没有放开,不是点一下,而是一直按着!),鼠标左键一放开,再执行一段代码

注意下:
1.不是MFC,是用Windows API
2.不是整个窗口,只是这个按钮或标签

谢谢各位的帮忙了,谢谢
10 回复
#2
rjsp2020-06-01 20:46
自己处理 WM_LBUTTONDOWN,WM_LBUTTONUP
先判断在哪个控件上
#3
Escapist2020-06-01 23:50
回复 2楼 rjsp
在创建窗口的时候,只是创建了窗口类、还有窗口的WndProc,现在我要加到一个控件里去,请问怎么办?

我用了Get/SetClassLong,但是用了之后之前Static有文字,但是Set完之后什么都没有了,背景也变成纯白色,请问怎么办?谢谢
#4
rjsp2020-06-02 09:51
两句话我都听不懂

现在,我将你的需求实现一遍:
第一步,用向导生成一个win32桌面程序
第二步,定义三个句柄的全局变量
HWND g_hMain, g_hBtn, g_hTxt;
第三步,创建两个控件
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 将实例句柄存储在全局变量中

  g_hMain = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
   g_hBtn = CreateWindowW( L"BUTTON", L"一个按钮", WS_VISIBLE|WS_CHILDWINDOW, 2,2,100,20, g_hMain, NULL, hInstance, NULL );
   g_hTxt = CreateWindowW( L"STATIC", L"静态文本", WS_VISIBLE|WS_CHILDWINDOW, 2,42,100,20, g_hMain, NULL, hInstance, NULL );

   ShowWindow(g_hMain, nCmdShow);
   UpdateWindow(g_hMain);
   return TRUE;
}
第四步,添加消息处理
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        if( msg.hwnd==g_hMain && (msg.message==WM_LBUTTONDOWN || msg.message==WM_LBUTTONUP) )
        {
            POINT pt = msg.pt;
            RECT rt_txt;
            GetWindowRect( g_hTxt, &rt_txt );
            if( PtInRect(&rt_txt,pt) )
            {
                if( msg.message == WM_LBUTTONDOWN )
                    MessageBoxW( msg.hwnd, L"你在静态标签上按下了左键", L"", MB_OK );
                else if( msg.message == WM_LBUTTONUP )
                    MessageBoxW( msg.hwnd, L"你在静态标签上抬起了左键", L"", MB_OK );
            }
        }
        else if( msg.hwnd==g_hBtn && (msg.message==WM_LBUTTONDOWN || msg.message==WM_LBUTTONUP) )
        {
            if( msg.message==WM_LBUTTONDOWN )
                MessageBoxW( msg.hwnd, L"你在按钮上按下了左键", L"", MB_OK );
            else if( msg.message==WM_LBUTTONUP )
                MessageBoxW( msg.hwnd, L"你在按钮上抬起了左键", L"", MB_OK );
        }

    }

再有问题的话,你最好在周围找个人问问。因为这些东西虽简单,但繁杂,描述起来不方便,适合手把手教。






[此贴子已经被作者于2020-6-2 11:14编辑过]

#5
Escapist2020-06-02 17:18
已无用

[此贴子已经被作者于2020-6-2 23:10编辑过]

#6
Escapist2020-06-02 17:19
我就是照着她这么写的
#7
Escapist2020-06-02 17:38
谢谢

[此贴子已经被作者于2020-6-2 17:40编辑过]

#8
Escapist2020-06-02 17:40
回复 4楼 rjsp
顺便再问下,请问Static控件如何载入一张bmp或jpg图片?


真的万分感谢,太谢谢了
#9
Escapist2020-06-02 23:10
回复 4楼 rjsp
谢谢,成功了

我来说一下我的方法
1.用OldWndProc=GetClassLong(hWnd,GCL_WNDPROC)取得这个组件自己的WndProc函数,不是窗口的
2.定义一个和WndProc返回值、参数一模一样的函数,里边使用和窗口的WndProc相同写法,强行自己自定义一个事件触发的代码
写完要自定义的函数之后,
return CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam)
这段代码通到原来默认的WndProc,
3.用SetWindowLong(hWnd,GCL_WNDPROC,NewWndProc)把这个控件的WndProc定义成这个新的函数
这样就可以同时执行我自己定义的和自动生成的WndProc了
不知道这样可以不可以?谢谢
这个东东貌似叫窗口子类化,可以看下https://blog.这个链接
谢谢帮助!
#10
rjsp2020-06-03 08:47
回复 8楼 Escapist
   HWND hPic = CreateWindowW( L"STATIC", L"静态文本", WS_VISIBLE|WS_CHILDWINDOW|SS_BITMAP, 2,82,100,20, g_hMain, NULL, hInstance, NULL );
   HANDLE hBitmap = LoadImageW(NULL, L"d:\\test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
   SendMessage( hPic, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap );
注意,L"d:\\test.bmp" 要改为你正确的路径
#11
Escapist2020-06-03 17:22
回复 10楼 rjsp
谢谢了,感谢~
1