| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2359 人关注过本帖
标题:关于C++ Win32窗口应用程序的一个问题,求求各位大佬进来看下
只看楼主 加入收藏
Escapist
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2020-4-27
结帖率:75%
收藏
已结贴  问题点数:30 回复次数:10 
关于C++ Win32窗口应用程序的一个问题,求求各位大佬进来看下
我用CreateWindowExA创建了一个按钮(Button)/标签(Static)控件,
需要:当我的鼠标左键在这个控件上按下,就开始执行一段代码(此时没有放开,不是点一下,而是一直按着!),鼠标左键一放开,再执行一段代码

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

谢谢各位的帮忙了,谢谢
搜索更多相关主题的帖子: C++ 鼠标 应用程序 Win32 窗口 
2020-06-01 20:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
自己处理 WM_LBUTTONDOWN,WM_LBUTTONUP
先判断在哪个控件上
2020-06-01 20:46
Escapist
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2020-4-27
收藏
得分:0 
回复 2楼 rjsp
在创建窗口的时候,只是创建了窗口类、还有窗口的WndProc,现在我要加到一个控件里去,请问怎么办?

我用了Get/SetClassLong,但是用了之后之前Static有文字,但是Set完之后什么都没有了,背景也变成纯白色,请问怎么办?谢谢
2020-06-01 23:50
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:30 
两句话我都听不懂

现在,我将你的需求实现一遍:
第一步,用向导生成一个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编辑过]

2020-06-02 09:51
Escapist
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2020-4-27
收藏
得分:0 
已无用

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

2020-06-02 17:18
Escapist
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2020-4-27
收藏
得分:0 
我就是照着她这么写的
2020-06-02 17:19
Escapist
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2020-4-27
收藏
得分:0 
谢谢

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

2020-06-02 17:38
Escapist
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2020-4-27
收藏
得分:0 
回复 4楼 rjsp
顺便再问下,请问Static控件如何载入一张bmp或jpg图片?


真的万分感谢,太谢谢了
2020-06-02 17:40
Escapist
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2020-4-27
收藏
得分:0 
回复 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.这个链接
谢谢帮助!
2020-06-02 23:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 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" 要改为你正确的路径
2020-06-03 08:47
快速回复:关于C++ Win32窗口应用程序的一个问题,求求各位大佬进来看下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032966 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved