对话框上的caption上的怎么增加一个button?

iamasea 2018-11-03 09:14:00
对话框上的caption上的怎么增加一个button?并且可以处理事件。
如图所示多谢!
...全文
107 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamasea 2018-11-03
  • 打赏
  • 举报
回复
有代码吗,最好是工程文件 。多谢
schlafenhamster 2018-11-03
  • 打赏
  • 举报
回复
即 OnNcHitTest(CPoint point)
oblivi 2018-11-03
  • 打赏
  • 举报
回复
这些一般不是控件,只是画上去的,判断鼠标是否在它的RECT中,再处理消息就可以了
zgl7903 2018-11-03
  • 打赏
  • 举报
回复
推荐无边框窗口,然后自绘标题栏, 就可以放置任意控件



jacky_qiu 2018-11-03
  • 打赏
  • 举报
回复


/****************************************************************************
主要思路是在处理主窗口的WM_WINDOWPOSCHANGED消息,并让指定窗口移动。
此方法可扩展应用到需要窗口跟随的很多场景中

win10 + vs2008 编译通过
代码仅供参考!
****************************************************************************/


#define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
#include <windows.h>
#include <tchar.h>


/****************************************************************************
浮动在标题栏的窗口
****************************************************************************/
HWND g_WndOnTitle;
namespace WndOnTitle
{
WNDPROC g_OldWndProc=NULL;
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
// make mouse click no lost focus
case WM_MOUSEACTIVATE:
return MA_NOACTIVATE;

case WM_RBUTTONDOWN:
{
::MessageBox(NULL,TEXT("for test"),_T("标题"),MB_OK);
}
break;

}

return ::CallWindowProc(g_OldWndProc, hWnd, message, wParam, lParam); // 注意是CallWindowProc 而非 DefWindowProc
}
};


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{

// By default, the DefWindowProc function sends the WM_SIZE and WM_MOVE messages to the window.
// The WM_SIZE and WM_MOVE messages are not sent if an application handles the WM_WINDOWPOSCHANGED message
// without calling DefWindowProc. It is more efficient to perform any move or size change processing during
// the WM_WINDOWPOSCHANGED message without calling DefWindowProc.
case WM_WINDOWPOSCHANGED:
{
LPWINDOWPOS lpwndpos = ((LPWINDOWPOS)lParam) ;
::SetWindowPos(g_WndOnTitle,NULL,lpwndpos->x+40,lpwndpos->y+4,0,0,SWP_NOSIZE|SWP_NOACTIVATE);
return ::DefWindowProc(hWnd, message, wParam, lParam); //调用原来的窗口过程
}
break;

case WM_CLOSE:
::DestroyWindow(hWnd);
PostQuitMessage(0);
break;
default:
return ::DefWindowProc(hWnd, message, wParam, lParam);
}

return 0;
}


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
WNDCLASS wndcls;
wndcls.cbClsExtra = 0;
wndcls.cbWndExtra = 0;
wndcls.lpszMenuName = NULL;
wndcls.hInstance = NULL;
wndcls.style = CS_HREDRAW|CS_VREDRAW;
wndcls.hCursor = LoadCursor(NULL,IDC_ARROW);
wndcls.lpszClassName = _T("Demo_MainWnd");
wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndcls.hIcon = LoadIcon(::GetModuleHandle(NULL),NULL);
wndcls.lpfnWndProc = WndProc;

if (!RegisterClass(&wndcls))
return 0;

HWND hWnd = CreateWindowEx(NULL,_T("Demo_MainWnd"),_T("Demo"),WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN ,
0,0,200,200,NULL,NULL,NULL,NULL) ;

ShowWindow(hWnd,SW_SHOWNORMAL);
UpdateWindow(hWnd);


//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//创建标题栏上面的窗口
RECT rect;
GetWindowRect(hWnd,&rect);
g_WndOnTitle=CreateWindowEx(NULL, _T("#32770"),_T("Demo"),WS_POPUP, rect.left+40,rect.top+4,50,25,hWnd,NULL,NULL,NULL) ;
::ShowWindow(g_WndOnTitle,SW_SHOWNOACTIVATE);
WndOnTitle::g_OldWndProc= (WNDPROC)::SetWindowLongPtr(g_WndOnTitle, GWLP_WNDPROC, (LONG_PTR)WndOnTitle::WndProc ) ;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}


Eleven 2018-11-03
  • 打赏
  • 举报
回复
用客户区的一块区域做标题栏可能会更容易一些~
cbzjzsb123 2018-11-03
  • 打赏
  • 举报
回复
https://download.csdn.net/download/jzycode/6485517
不知道是不是这个

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧