利用wmctrl控制窗口
wmctrl交叉编译
wmctrl交叉编译1. 什么是wmctrl?wmctrl是一个用于控制和管理窗口的命令行工具。
它可以通过命令行界面来操作窗口的位置、大小、标题等属性,还可以实现窗口的最小化、最大化、切换、关闭等功能。
使用wmctrl可以方便地对窗口进行管理,特别适用于自动化脚本或者需要对多个窗口进行操作的场景。
2. 为什么需要交叉编译wmctrl?通常情况下,wmctrl是在Linux系统上编译和使用的。
然而,有时候我们可能需要在其他平台上使用wmctrl,比如嵌入式系统或者其他操作系统。
这时候就需要进行交叉编译,将wmctrl编译成适用于目标平台的可执行文件。
交叉编译是指在一种操作系统上编译适用于另一种不同体系结构或操作系统的程序。
通过交叉编译,我们可以将源代码编译成目标平台上可执行的二进制文件,从而在不同的平台上使用相同的功能。
3. 如何进行wmctrl的交叉编译?要进行wmctrl的交叉编译,我们需要以下几个步骤:步骤1:准备交叉编译工具链交叉编译需要使用特定的工具链,该工具链包含了适用于目标平台的编译器、链接器和库文件。
我们需要根据目标平台的架构和操作系统选择合适的工具链。
一般来说,交叉编译工具链可以从官方网站或者开发板厂商的支持页面上获取。
步骤2:下载wmctrl源代码在进行交叉编译之前,我们需要获取wmctrl的源代码。
可以从官方的源代码仓库或者GitHub上下载最新的源代码包。
下载完成后,解压源代码包到本地目录。
步骤3:配置编译参数进入解压后的源代码目录,使用文本编辑器打开Makefile文件,根据目标平台的要求配置编译参数。
主要包括编译器选项、库文件路径、目标平台架构等。
步骤4:进行交叉编译在配置完成后,打开终端,进入源代码目录。
执行以下命令进行交叉编译:make编译过程可能需要一些时间,取决于源代码的大小和复杂度。
编译完成后,会在源代码目录生成可执行文件。
步骤5:部署和测试将编译生成的可执行文件复制到目标平台上,然后在目标平台上执行该文件。
WM_CTLCOLOR 消息
它的子窗口控件(如单选按钮、复选框、滚动条等)之一就是要在屏幕上绘制每次WM_CTLCOLOR 邮件是发送到一个窗口。
此消息之前控件的绘制。
当需要更改控件的外观这可以通过处理WM_CTLCOLOR 消息。
更多信息当发送WM_CTLCOLOR 时,wParam 包含为子窗口(在本例中该控件)显示上下文的句柄。
lParam 的LOWORD 标识子窗口由其ID 号并lParam 的HIWORD 包含为下列值之一指定要绘制的控件的类型:CTLCOLOR_BTN button controlCTLCOLOR_DLG dialog boxCTLCOLOR_EDIT edit controlCTLCOLOR_LISTBOX list boxCTLCOLOR_MSGBOX message boxCTLCOLOR_SCROLLBAR scroll barCTLCOLOR_STATIC static text, frame, or rectangle在处理时WM_CTLCOLOR 画笔的句柄必须返回。
若要返回画笔的句柄失败将导致在调试版本的Windows 中调试显示器上一个Windows FatalExit。
DefWindowProc()已为此邮件的响应中返回一个句柄;但是,应用程序可能返回不同的句柄自定义控件的颜色。
返回的句柄指定要用来绘制该控件画笔。
例如对于Windows 2.x 在下面的代码绘制的所有按钮浅灰色背景:case WM_CTLCOLOR:if (HIWORD(lParam) == CTLCOLOR_BTN)return (GetStockObject(LTGRAY_BRUSH));return (GetStockObject(WHITE_BRUSH));在这种情况下,所有其他控件的背景绘制白色。
请注意GetStockObject()返回参数所指定的股票画笔的句柄。
若要将在Windows 3.0 和更高版本中的一个按钮控件的背景色就需要创建一个所有者绘制按钮。
TK WM命令
Tcl/Tk中的WM命令的正确使用一、WM的简单介绍WM的全名为Communicate with window manager,是一个TCL/TK中的内建的命令。
其语法是wm option window ? args?。
WM 命令用于和窗口管理器进行交互,以便控制窗口的标题,几何形状,或者是窗口大小改变。
WM命令参数不同,其格式也不同。
WM命令的一般格式有:wm aspect window ?minNumer minDenom maxNumer maxDenom?当规定了minNumer, minDenom, maxNumer, and maxDenom 后,这些参数将被传递给窗口管理器,且窗口管理器会用它们来规定窗口可用的外观比率。
窗口的外观比率(宽/长)将会被限定在minNumer/minDenom 和 maxNumer/maxDenom之间。
如minNumer等被赎为空值时,那么所有已存在的外观比率的约定都会被移走。
如minNumer等等,被定义,那么该命令会返回一个空串。
否则,它将会返回一个包括四个元素的TCL列表。
这四个元素为minNumer, minDenom, maxNumer, and maxDenom 的当前值(如果没有外观约定,那么会驼回一个为空的串。
)二、WM的使用说明A、wm client window ?name?当定义了名字以后,该命令会存储名字(该名字应为正在运行程序的主机名)到窗口的WM_CLIENT_MACHINE属性以供窗口管理者或会话管理使用。
在这种情形下,该命令会返回一个为空的字符串。
如果没有规定名字,该命令会返回窗口的wm client命令中最后设定的名字。
如果名字定义为一个空串,该命令会从窗口中删除WM_CLIENT_MACHINE属性。
B、wm colormapwindows window ?windowList?该命令用来控制WM_COLORMAP_WINDOWS属性,该属性提供关于窗口色图的信息给窗口管理器。
wndproc 类方法
wndproc 类方法wndproc 类方法是Windows操作系统中的一个重要类方法,用于处理窗口消息。
在Windows应用程序中,窗口是用户界面的基本元素,用户通过窗口与程序进行交互。
当用户执行某个操作,比如点击按钮或者输入文本时,操作系统会生成相应的窗口消息,并将其发送给窗口的消息处理函数(即wndproc 类方法)。
wndproc 类方法会根据接收到的消息类型进行相应的处理,以实现程序对用户操作的响应。
wndproc 类方法是一个回调函数,它的原型如下:LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);其中,hWnd是窗口句柄,message是消息类型,wParam和lParam是消息的参数。
wndproc 类方法的返回值为LRESULT类型,表示消息处理的结果。
wndproc 类方法的主要作用是根据接收到的消息类型,执行相应的操作。
例如,当接收到WM_PAINT消息时,wndproc 类方法会调用相应的绘图函数,将窗口的内容绘制出来;当接收到WM_COMMAND消息时,wndproc 类方法会根据消息的wParam参数,执行相应的菜单或按钮操作;当接收到WM_CLOSE消息时,wndproc 类方法会关闭窗口等等。
wndproc 类方法在Windows应用程序的消息循环中起着重要的作用。
消息循环是程序的主要循环,它负责接收和分发窗口消息。
在消息循环中,程序会不断调用wndproc 类方法,以处理接收到的消息。
通常,消息循环结构如下:while(GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}在消息循环中,GetMessage函数用于获取消息队列中的消息,TranslateMessage函数用于将键盘消息转换为字符消息,DispatchMessage函数用于将消息发送给wndproc 类方法进行处理。
(MFC)无标题栏窗口移动方法
移动标准窗口是通过用鼠标单击窗口标题条来实现的,但对于没有标题条的窗口,就需要用鼠标单击窗口标题条以外区域来移动窗口。
有两种方法可以达到这一目标。
方法一:当窗口确定鼠标位置时,Windows向窗口发送WM_NCHITTEST消息,可以处理该消息,使得只要鼠标在窗口内,Windows便认为鼠标在标题条上。
这需要重载CWnd类处理WM_NCHITTEST消息的OnNcHitTest函数,在函数中调用父类的该函数,如果返回HTCLIENT,说明鼠标在窗口客户区内,使重载函数返回HTCAPTION,使Windows误认为鼠标处于标题条上。
下例是使用该方法的实际代码:UINT CEllipseWndDlg::OnNcHitTest(CPoint point){// 取得鼠标所在的窗口区域UINT nHitTest = CDialog::OnNcHitTest(point);// 如果鼠标在窗口客户区,则返回标题条代号给Windows// 使Windows按鼠标在标题条上类进行处理,即可单击移动窗口return (nHitTest==HTCLIENT) ? HTCAPTION : nHitTest;}方法二:当用户在窗口客户区按下鼠标左键时,使Windows认为鼠标是在标题条上,即在处理WM_LBUTTONDOWN消息的处理函数OnLButtonDown中发送一个wParam参数为HTCAPTION,lParam为当前坐标的WM_NCLBUTTONDOWN消息。
下面是使用该方法的实际代码:void CEllipseWndDlg::OnLButtonDown(UINT nFlags, CPoint point){// 调用父类处理函数完成基本操作CDialog::OnLButtonDown(nFlags, point);// 发送WM_NCLBUTTONDOWN消息// 使Windows认为鼠标在标题条上PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x, point.y)); //或SendMessage(WM_SYSCOMMAND,0xF012,0); //0xF012 = SC_MOVE | HTCAPTION}首先,看看在正常情况下系统是怎样来移动程序窗口的。
如何获得窗口句柄(hwnd)和改变窗口属性
1、对于一个窗口如何进行操作呢,首先要得到其使用句柄,我们可以用FindWindow()函数来获取当前窗口句柄,具体使用如下:HWND hFig = ::FindWindow(NULL,HWND);如果得到找到,则返回窗口的句柄,否则返回NULL。
当然我们可以使用SetWindowPos(HWND hWnd, HWND hWndIsertAfter, int X, int Y, int cx, int cy , UINT Uflags) 改变窗口的大小和位置,Uflags是标志窗口的显示属性,具体值可以是SWP_NOMOVE 、SWP_NOZORDER 、SWP_N OACTIVATE 、SWP_FRAMECHANGED等。
具体的调用实例如下:HWND hFig = ::FindWindow(NULL,"Fig No. 1"); //找到窗口,并返回窗口句柄if(hFig == NULL) {AfxMessageBox("未能产生Figure窗口,图形绘制失败!");return;} // 获取绘图区域的位置和大小RECT PlotRec;CWnd *PlotArea = GetDlgItem(IDC_PLOTAREA); // 获取绘图区域指针PlotArea->GetWindowRect(&PlotRec); // 将绘图区域矩形赋给定义矩形long Width = PlotRec.right - PlotRec.left; long Height = PlotRec.bottom - PlotRec.to p; // 获得绘图区域的宽和高// 设置Figure窗口为绘图区域窗口的子窗口并调整其位置::SetParent(hFig,PlotArea->GetSafeHwnd()); // 设置绘图区域窗口为Figure窗口的父窗口::SetWindowPos(hFig,NULL,1,1,Width,Height,SWP_NOZORDER | SWP_NOACTIVATE); // 设置绘图窗口的大小和位置// 设置窗口可见SetVisible(h_a,mwArray("ON"));// 进入窗口等待状态bWait = 1; mlfHGWaitForFiguresToDie();2、当然你想改变窗口属性的话,还可以增加以下函数来改变窗口的属性long lStyle. = ::GetWindowLong(hFig,GWL_STYLE);::SetWindowLong(hFig,GWL_STYLE,lStyle. & (~WS_CAPTION) & (~WS_THICKFRAM E));::SetWindowPos(hFig,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTI VATE | SWP_FRAMECHANGED);就写到这吧,其他的学会了再统一以一个实例的形式给出。
MFC使用教程
MFC使用教程第一部分:MFC简介Visual C++ 不仅仅是一个编译器。
它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的C++ 来开发出专业级的Windows 应用程序。
为了能充分利用这些特性,你必须理解C++ 程序设计语言。
掌握了C++,你就必须掌握Microsoft 基本类库(MFC) 的层次结构。
该层次结构包容了Windows API 中的用户界面部分,并使你能够很容易地以面向对象的方式建立Windows 应用程序。
这种层次结构适用于所有版本的Windows 并彼此兼容。
你用MFC 所建立的代码是完全可移植的。
简单介绍MFC的基本概念和术语以及事件驱动程序设计方法。
输入、编译和运行一个简单的MFC程序。
第二部分中将详细解释这些代码。
第三部分讨论了MFC控件和如何定制它们。
什么是MFC?如果你要建立一个Windows 应用程序,应该如何下手?好的开端是从设计用户界面开始。
首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象。
Windows 用户界面有一些标准的控件,如按钮、菜单、滚动条和列表等,这对那些Windows 用户已经是很熟悉了。
要记住的是,作为程序员必须选择一组控件并决定如何把它们安排到屏幕上。
传统上,你需要在纸上做一下用户界面的草图,直到对各元素感到满意为止。
这对于一些比较小的项目,以及一些大项目的早期原型阶段是可以的。
下一步,是要实现代码。
为任何Windows 平台建立应用程序时,程序员都有两种选择:C 或C++。
使用C,程序员是在Windows 应用程序界面( API ) 的水平上编写代码。
该界面是由几百个 C 函数所组成,这些函数在Windows API 参考手册中都有介绍。
对于Windows NT, API 被称为"Win32 API",以区别于其用于Windows 3.1的16位API, Microsoft 也提供了C++ 库,它位于任何Windows API 之上,能够使程序员的工作更容易。
第12章 视窗管理器(WM)
第12章视窗管理器(WM)使用µC/GUI管理器(WM)时,在显示屏上显示的的所有内容包括在一个窗口里面——屏幕上的一块区域,该区域作为一个绘制或显示对象的用户接口部件。
窗口可以是任意大小,你可能在屏幕上同时显示多个窗口,甚至在其它窗口的上面部分或完全地显示。
视窗管理器提供了一套函数,使你能很容易地对许多窗口进行创建,移动,调整大小及其它操作。
它也可以提供更低层的支持,这通过管理显示屏上的窗口的层,及通过给你的应用程序发送信号以显示影响它的窗口的修改来完成。
µC/GUI的视窗管理器是一个独立的(可选的)的软件项目,它没有包括进µC/GUI基本软件包里。
视窗管理器的软件位于子目录“GUI\WM”下。
第1页µC/GUI中文手册第12章视窗管理器(WM)12.1 术语解释窗口外形是矩形,由它们的原点(左上角的X和Y坐标)及它们的X和Y尺寸(分别是宽和高)所定义。
µC/GUI中一个窗口:· 是一个矩形· 有一个Z坐标· 可能是隐藏的或可见的· 可能拥有有效/或无效区域· 可以或者不可以有透明区域· 可以或者不可以有一个回调函数活动窗口当前正在使用进行绘图操作的窗口被当作活动窗口。
与最顶层窗口一样,它不是必需的。
回调函数回调函数在用户程序中定义,当一个指定的事件发生时,通知图形系统调用指定的函数。
通常应用于一个窗口内容改变时自动重绘的场合。
子/父窗口,同胞一个子窗口的定义是相对于另一个窗口,该窗口称为父窗口。
无论什么时候,一个父窗口移动了,它的子窗口会相应随之移动。
一个子窗口总是完全包含在它的父窗口里面,如果需要,它会被剪切。
从属于同一个父窗口的多个子窗口相互间的关系称为“同胞”。
客户区一个窗口的客户区简单地说是它的可使用区。
如果一个窗口包括一个边框或标题栏,则客户区是内部的矩形区域。
如果没有这样一个边框,则客户区等同于窗口本身。
如何获得窗口句柄和改变窗口属性
如何获得窗口句柄和改变窗口属性要获得窗口句柄(HWND),可以使用WinAPI中的FindWindow函数或FindWindowEx函数。
1. 使用FindWindow函数:```HWND hWnd = FindWindow(NULL, L"窗口标题");```这个函数会在当前活动的桌面窗口中查找指定标题的窗口,并返回窗口句柄。
2. 使用FindWindowEx函数:```HWND hParent = FindWindow(NULL, L"父窗口标题");HWND hWnd = FindWindowEx(hParent, NULL, NULL, L"子窗口标题");```这个函数会在指定父窗口中查找指定标题的子窗口,并返回子窗口句柄。
要改变窗口属性,可以使用WinAPI中的SetWindowLong函数或SetWindowPos函数。
1. 使用SetWindowLong函数:```LONG_PTR dwStyle = GetWindowLongPtr(hWnd, GWL_STYLE);dwStyle &= ~WS_CAPTION; // 移除标题栏SetWindowLongPtr(hWnd, GWL_STYLE, dwStyle);SetWindowPos(hWnd, NULL, x, y, width, height,SWP_FRAMECHANGED); // 重新绘制窗口```这个函数可以改变窗口的样式,如移除标题栏、调整窗口大小等。
2. 使用SetWindowPos函数:```SetWindowPos(hWnd, NULL, x, y, width, height,SWP_FRAMECHANGED);```这个函数可以重新设置窗口的位置、大小,并且可以实时更新窗口的样式。
需要注意的是,对于不属于当前进程创建的窗口,可能需要通过其他技术手段获取窗口句柄并改变属性,如使用钩子函数或其他进程间通信的方式。
WM_CTLCOLOR和OnCtlColor消息的用法
WM_CTLCOLOR和OnCtlColor消息的用法很多人都觉得自己的程序的界面不那么美观,往往VC默认产生的对话框比较单调,因此很多人往往找到很多其它的控件对对话框进行美化修饰,例如给静态控件设置字体,设置背景颜色等等,其实这些完全可以由VC自己的WM_CTLCOLOR消息来完成!WM_CTLCOLOR消息用来完成对EDIT、STATIC、BUTTON等控件设置背景和字体颜色,其用法如下:1.首先在自己需要设置界面的对话框上点击右键-->建立类向导-->加入WM_CTLCOLOR消息-->自动生成OnCtlColor()函数,此函数可以对本对话框的控件的界面外观做修饰,用法如下:将类向导产生的函数做如下修改:HBRUSH CDialogColor::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC,pWnd, nCtlColor);// TODO: Change any attributes of theDC here//设置显示字体CFont * cFont=new CFont;cFont->CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,"Arial");//对特定的控件做修改switch(nCtlColor){case CTLCOLOR_STATIC: //对所有静态文本控件的设置{pDC->SetBkMode(TRANSPARENT);//设置背景为透明pDC->SetTextColor(RGB(255,255,0)); //设置字体颜色pWnd->SetFont(cFont); //设置字体HBRUSH B = CreateSolidBrush(RGB(125,125,255));//创建画刷return (HBRUSH) B; //返回画刷句柄}case CTLCOLOR_EDIT: //对所有编辑框的设置{pDC->SetBkMode(TRANSPARENT);pDC->SetTextColor(RGB(255,255,0));pWnd->SetFont(cFont);HBRUSH B = CreateSolidBrush(RGB(125,125,255));return (HBRUSH) B;}default:return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);}}注:case的类别有以下几种:CTLCOLOR_BTN 按钮控件CTLCOLOR_DLG 对话框CTLCOLOR_EDIT 编辑框CTLCOLOR_LISTBOX 列表框CTLCOLOR_MSGBOX 消息框CTLCOLOR_SCROLLBAR 滚动条CTLCOLOR_STATIC 静态文本2.你可能觉得对所有的控件使用统一的界面设置觉得不自由,其实VC同样可以对特定的ID 的控件进行设置,方法如下:switch (pWnd->GetDlgCtrlID()){//针对ID为IDC_CTL1、IDC_CTL2和IDC_CTL3的控件进行同样的设置case IDC_CTL1:case IDC_CTL2:case IDC_CTL3:{pDC->SetBkMode(TRANSPARENT);pDC->SetTextColor(RGB(255,255, 0));pWnd->SetFont(cFont);HBRUSH B = CreateSolidBrush(RGB(125,125,255));return (HBRUSH) B;}default:return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);}通过消息WM_CTLCOLOR我们可以改变对话框或一些特殊控件的背景颜色1、添加WM_CTLCOLOR消息映射。
wmctrl交叉编译
wmctrl交叉编译摘要:1.交叉编译的概念和原理2.wmctrl 的介绍和功能3.wmctrl 的交叉编译流程4.wmctrl 交叉编译的实例5.wmctrl 交叉编译的意义和应用场景正文:一、交叉编译的概念和原理交叉编译是指在计算机A 上编译得到适合在计算机B 上运行的程序,其中计算机A 和计算机B 可以是不同体系结构的计算机。
交叉编译的目的是为了实现代码的可移植性,使得一个平台上的程序能够在另一个平台上运行。
在交叉编译过程中,编译器需要考虑到目标平台的指令集、库函数、操作系统接口等方面的差异,因此交叉编译相对于同一平台下的编译要复杂得多。
二、wmctrl 的介绍和功能wmctrl 是一个用于控制窗口管理的Linux 命令行工具,它可以实现窗口的移动、缩放、最大化等功能。
wmctrl 的功能主要包括以下几个方面:1.控制窗口的位置和大小2.控制窗口的层叠和透明度3.控制窗口的行为和样式4.控制窗口的输入和输出三、wmctrl 的交叉编译流程wmctrl 的交叉编译主要分为以下几个步骤:1.获取源代码:首先需要从wmctrl 的官方GitHub 仓库中获取源代码。
2.配置编译环境:根据目标平台的体系结构和编译器选择合适的交叉编译工具链,例如GCC、Clang 等。
3.编译源代码:使用交叉编译工具链编译wmctrl 的源代码,生成目标平台的可执行文件。
4.测试可执行文件:在目标平台上运行编译生成的可执行文件,验证其功能和性能。
四、wmctrl 交叉编译的实例以在x86 架构的Linux 系统上编译生成适用于ARM 架构的Linux 系统上的wmctrl 为例,可以按照以下步骤进行交叉编译:1.安装交叉编译工具链:在x86 架构的Linux 系统上安装GCC 的交叉编译工具链。
2.获取源代码:从wmctrl 的GitHub 仓库中克隆源代码。
3.配置编译环境:使用交叉编译工具链编译wmctrl 的源代码。
WM_CLOSE,WM_DESTROY,WM_QUIT的不同、Invalidate和UpdateWindow的区别
WM_CLOSE,WM_DESTROY,WM_QUIT的不同有三个消息看起来差不多,都是处理关闭的事情的,它们是WM_CLOSE,WM_DESTROY,和WM_QUIT。
它们的确很相似,但你需要知道它们之间的不同!一个窗口或者应用程序应该被关闭时发出WM_CLOSE 消息,当接收到WM_CLOSE消息时,如果你愿意,可以向用户提出是否真的要退出。
你知道让用户作确认或有错误出现或有什么应该注意的事情发生的时候,往往弹出一个消息框。
插播:消息框int MessageBox(HWND hWnd, // handle of owner windowLPCTSTR lpText, // address of text in message boxLPCTSTR lpCaption, // address of title of message boxUINT uType // style of message box);1. 当收到WM_CLOSE消息,你可以做两件事儿。
一件是你接受默认的处理并返回一个值,你若这样做了,应用程序或窗口按照计划关闭;或者,你返回0,应用程序或窗口将保持原样。
以下是代码的基本部分:if (msg == WM_CLOSE){if (MessageBox(hMainWindow, "Are you sure want to quit?", "Notice", MB_YESNO | MB_ICONEXCLAMATION) == IDNO)return(0);// otherwise, let the default handler take care of it}2. WM_DESTROY消息有点儿不同,它是窗口正在关闭时发出的。
当收到WM_DESTROY消息的时候,窗口已经从视觉上被删除;但一个主窗口被关闭,并不意味着应用程序结束了,因为它可以在没有窗口的条件下继续运行。
[计算机]MFC窗口位置管理详细分析及实例
MFC窗口位置管理详细分析及实例在一般用MFC编写的程序的窗口客户区中,可能有好几个子窗口(具有WM_CHILD风格的窗口)。
上边是工具栏,中间是视图窗口,下边是状态栏。
三个窗口在框架的客户区里和平共处,互不重叠。
主框架窗口的尺寸改变了,别的子窗口都能及时调整自己的尺寸以便保持相互位置关系不变,例如状态条窗口总能保持在主框架客户区底部,并且其宽度总能和主框架客户区宽度一致。
工具栏窗口总能停靠在主框架的某一边不变,其宽度或高度总能和主框架客户区的宽度或高度一致,视图窗口总能填满主框架客户区的剩余空间。
假如我们自己从CWnd类派生一个窗口类并生成一个窗口,在它的客户区里要生成若干个子窗口,我们想使这些子窗口排列得规规矩矩,互不重叠,当父窗口的尺寸变了时各个子窗口能适时调整自己的尺寸和位置,使各个子窗口之间的位置大小比例关系不变。
当移动其中一个或几个子窗口时,别的子窗口能及时为这个移动了的子窗口让位。
当然我们可以利用api函数里管理窗口的函数来编写自己的管理子窗口的方法。
可是如果在父窗口的客户区里有了工具栏,状态条等等子窗口时,你自己加进来的子窗口还能和这些mfc提供的子窗口融洽相处吗?你如何保证你的子窗口不会覆盖了能够四处停靠的工具栏?当工具栏和状态条消失后你的子窗口如何才能知道,以便及时调整自己的大小从而覆盖工具栏和状态条腾出的空间?基于文档视图构架的窗口的客户区内还有个视图,你自己硬加上的子窗口能不和视图窗口争地盘吗?所以必须了解mfc的窗口管理它的客户区的方法。
其实,mfc的窗口管理它的客户区的方法是非常简单的:父窗口调用一个函数,子窗口响应一个消息,就这么多。
CWnd::RepositionBars函数和WM_SIZEPARENT消息先简述一下mfc的窗口为子窗口分配客户区空间的过程:这一过程是父窗口与子窗口共同协调完成的。
父窗口先提供它的客户区内的一块区域,叫做起始可用区域。
然后调用一个函数,在这个函数里,父窗口把这片区域通过一个消息提交给它的第一个子窗口,该子窗口决定自己要占用多大一块,然后在可用区域里把它将占据的部分划出去,这样可用区域就被切去了一块。
mfc clistctrl 使用
mfc clistctrl 使用摘要:一、MFC CListCtrl 控件简介1.MFC (Microsoft Foundation Class)2.CListCtrl 控件的作用和特点3.CListCtrl 与标准列表框的区别二、CListCtrl 基本使用方法1.添加CListCtrl 控件2.设置CListCtrl 属性3.向CListCtrl 添加项目4.选择和操作CListCtrl 项目三、CListCtrl 常用消息处理1.列表框通知消息2.列表框编辑消息3.列表框鼠标消息四、CListCtrl 高级应用技巧1.自定义CListCtrl 样式2.添加图像列表3.实现多列列表框4.实现选择模式五、CListCtrl 在实际项目中的应用1.文件管理器2.资源管理器3.程序界面正文:MFC(Microsoft Foundation Class)是微软提供的一个用于开发Windows 应用程序的C++ 类库。
在MFC 中,CListCtrl 是一个功能强大的列表控件,可以方便地实现类似于资源管理器、文件管理器等应用程序的列表功能。
CListCtrl 不仅具有标准列表框的基本功能,还提供了许多高级特性,使得开发人员可以轻松地实现复杂的界面和功能。
一、MFC CListCtrl 控件简介MFC CListCtrl 控件是MFC 类库中的一个重要组件,继承自CCommonControl。
它可以看作是标准列表框(CListBox)的增强版,提供了更多的属性和功能。
CListCtrl 主要用于显示一系列项目,用户可以选择、编辑和操作这些项目。
与标准列表框相比,CListCtrl 提供了更丰富的样式和布局选项,可以自定义列表项的外观,满足不同的用户需求。
二、CListCtrl 基本使用方法在MFC 应用程序中,首先需要添加CListCtrl 控件。
通过向对话框或视图类中添加CListCtrl 成员变量,并在“资源编辑器”中设置其ID,即可在界面上看到该控件。
winform实现双击缩放和拖动
WinForm无边框窗体实现双击缩放及拖动有时候要实现无边框的winform窗体,由于没有边框了,所以缩放功能没有了,同时也不能拖动窗体。
在实际应用中,我们经常会有一个窗体的头部来显示Title,需要在这个头部左键双击实现缩放以及左键按住实现拖动。
缩放时,应该首先设置窗体的默认长、宽及与屏幕的左边距和上边距。
拖动时,根据鼠标位置移动窗体位置。
两个操作都是根据MouseDown事件来操作的,所以要理清思路。
双击缩放,在第一次点击时,设置过期时间,若在过期时间内在此点击,则改变窗体大小。
拖动时,需要MouseDown、MouseUp、MouseMove同时配合,在MouseDown是第一次触发时,记录当前鼠标位置,并设置属性左键按下标记leftFlag为true。
若leftFlag为true 移动鼠标,则在MouseMove事件下开始移动窗体,MouseUp事件中改变左键按下标记leftFlag为false。
过期时间:Timer timer = new Timer();点击次数:clickTime=0;左键按下标志:leftFlag=false;窗体初始化时设置过期时间:timer.Interval = 300;timer.Tick += (s, e1) =>{ timer.Stop(); clickTime = 0; };MouseMove事件:private void panel1_MouseMove(object sender, MouseEventArgs e){if (leftFlag){Point mouseSet = Control.MousePosition;mouseSet.Offset(mPoint.X, mPoint.Y); //设置移动后的位置Location = mouseSet;}}MouseUp事件:private void panel1_MouseUp(object sender, MouseEventArgs e){leftFlag = false;}MouseDown事件:private void panel1_MouseDown(object sender, MouseEventArgs e) {clickTime++;timer.Start();if (clickTime % 2 == 0){this.WindowState = this.WindowState ==FormWindowState.Maximized ?FormWindowState.Normal :FormWindowState.Maximized;clickTime = 0;}else{if (!leftFlag){mPoint.X = -e.X;mPoint.Y = -e.Y;leftFlag = true;}else{leftFlag = false;}}}。
mfc radio控件的enablewindow函数
mfc radio控件的enablewindow函数【MFC Radio控件的EnableWindow函数】在使用MFC(Microsoft Foundation Class)框架开发图形用户界面(GUI)应用程序时,常常会使用各种控件来为用户提供丰富的交互体验。
其中之一便是Radio控件,即单选按钮。
Radio控件常用于实现一组互斥的选择项,例如性别选择、语言选择等。
当我们想要在特定情况下禁用(或启用)Radio控件时,可以使用MFC中提供的控件操作函数。
其中之一便是EnableWindow函数。
本文将详细介绍MFC Radio控件的EnableWindow函数的使用方法,并逐步回答相关问题。
1. EnableWindow函数的基本介绍EnableWindow函数是MFC框架中用于启用或禁用指定窗口(包括Radio控件)的函数。
该函数的声明如下:BOOL EnableWindow(BOOL bEnable = TRUE);其中,bEnable参数指定控件的启用状态,设置为TRUE表示启用控件,设置为FALSE表示禁用控件。
函数返回值为BOOL类型,表示是否成功执行了启用或禁用操作。
2. 使用EnableWindow函数启用或禁用Radio控件的步骤下面将一步一步回答关于使用EnableWindow函数启用或禁用Radio控件的相关问题。
步骤一:包含头文件在需要使用EnableWindow函数的源文件中,首先需要包含MFC相关的头文件。
通常情况下,可以在源文件的顶部位置添加如下代码:#include "afxwin.h"步骤二:获取指定Radio控件的指针在使用EnableWindow函数之前,我们需要获取要操作的Radio控件的指针。
可以通过以下步骤来实现:(1)打开MFC设计器,双击打开要操作的对话框,进入对话框编辑模式。
(2)在左侧的工具箱中选择Radio Button控件,然后在对话框区域点击鼠标左键,即可在对话框上添加一个Radio控件。
如何获得窗口句柄和改变窗口属性
如何获得窗口句柄和改变窗口属性
要获得窗口句柄(HWND),可以使用FindWindow函数或者FindWindowEx函数。
这两个函数都需要传入窗口类名(可以为空)和窗
口标题(可以为空),通过这两个参数来定位窗口。
例如,下面的代码展示了如何使用FindWindow函数来获取窗口句柄:```c++
HWND hwnd = FindWindow(NULL, "窗口标题");
if (hwnd != NULL)
//找到窗口了,可以继续进行操作
} else
//没有找到窗口
```
要改变窗口属性,可以使用SetWindowLong或者SetWindowPos函数。
SetWindowLong函数允许你改变窗口的样式、扩展样式和用户数据。
SetWindowPos函数允许你改变窗口的位置和大小。
例如,下面的代码展示了如何使用SetWindowPos函数来改变窗口大
小和位置:
```c++
HWND hwnd = FindWindow(NULL, "窗口标题");
if (hwnd != NULL)
//改变窗口大小和位置
SetWindowPos(hwnd, NULL, x, y, width, height, SWP_NOZORDER);
} else
//没有找到窗口
```
上面的代码中,x和y是窗口的新位置,width和height是窗口的新大小。
SWP_NOZORDER参数表示不改变窗口的Z顺序(即不改变窗口的层次关系)。
MFC 调整窗口大小
{
jiyuan.ShowWindow(SW_SHOW); //显示对话框
jiyuan.MoveWindow (0,0,950,680); //调整对话框的位置和大小
gongcha.DestroyWindow(); //销毁其他的对话框,在此,gongcha为其他对话框类的对象
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
GetClientRect(&m_rect); //获取对话框的大小
return TRUE; // return TRUE unless you set the focus to a control
}
else//(!::IsWindow(jiyuan.m_hWnd)) //如果对话框还未打开
{
jiyuan.Create(IDD_DIALOG1,this); //创建对话框
jiyuan.MoveWindow (0,0,950,680); //调整对话框的位置和大小
jiyuan.ShowWindow(SW_SHOW); //显示对话框
}
}
任务完成!
1.单文档窗体大小的设置。
在CxxxApp中的InitInstance中加入如下代码:
m_pMainWnd->SetWindowPos(NULL,0,0,950,680,SWP_NOMOVE); //此句为添加代码,用于改变窗体的大小
m_pMainWnd->ShowWindow(SW_SHOW);
2.1举例如下:
mfc setwindowpos用法
mfc setwindowpos用法一、概述MFC(Microsoft Foundation Class)是微软提供的用于开发Windows应用程序的类库,其中setwindowpos函数用于设置窗口的位置。
本文将介绍setwindowpos函数的用法。
二、setwindowpos函数介绍setwindowpos函数是MFC中的一个成员函数,用于将窗口的位置移动到指定的位置。
该函数的原型如下:void SetWindowPos(CWnd* pWnd, int nIndex, const CWnd* pWndInsertAfter = NULL, DWORD dwFlags = 0, int x = 0, int y = 0);其中,pWnd是要移动的窗口对象,nIndex指定了移动后的位置,pWndInsertAfter指定了移动后的窗口顺序,dwFlags指定了一些附加的选项,x 和y是可选参数,用于指定窗口在屏幕上的具体位置。
三、用法示例以下是一个简单的setwindowpos用法示例:1. 首先,需要创建一个MFC窗口类并添加一个按钮控件。
2. 在按钮的点击事件处理函数中,调用setwindowpos函数来移动窗口。
3. 设置窗口的初始位置和大小,以及要移动到的位置。
示例代码如下:// 创建MFC窗口类并添加按钮控件// ...// 添加按钮控件事件处理函数void CMyAppView::OnBnClickedButton() {// 获取当前窗口的句柄HWND hWnd = AfxGetMainWnd()->m_hWnd;// 设置窗口初始位置和大小SetWindowPos(NULL, 100, 100, 300, 200, SWP_NOSIZE | SWP_NOMOVE);// 将窗口移动到指定的位置SetWindowPos(hWnd, HWND_TOP, 500, 500);}四、注意事项在使用setwindowpos函数时,需要注意以下几点:1. 需要确保窗口句柄的有效性,否则可能会导致程序崩溃或异常。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【转载】利用wmctrl控制窗口2009-06-29 16:02:48
分类:IT职场
使用wmctrl控制窗口行为使用wmctrl控制窗口行为
2008年04月08日星期二 , 1,260 次点击
前两天我谈了窗口匹配工具Devil’s Pie的使用,和DP一样,wmctrl同样可以控制窗口的行为。
不同的是,DP是一个规则匹配工具,通过检查既有的窗口规则配置文件在DP启动时或窗口打开时应用规则到窗口;而wmctrl是一个命令行工具,它完全通过命令行命令来控制窗口行为。
一个使用wmctrl操纵窗口行为的实际命令如下:
wmctrl -r firefox -b add,shaded
此命令将标题中含有”firefox”字串的窗口折叠起来。
wmctrl的命令行命令格式分为三个组成部分:动作、选项和参数。
要控制一个窗口的行为,首先要让wmctrl找到这个窗口。
在这一点上,wmctrl是通过参数来实现的。
<DESK>
值为一个整数,用来指定相应的工作区。
和DP不同,wmctrl从0开始计数,即第一个虚拟桌面为0,第二个是1。
<MVARG>
一个”g,x,y,w,h”格式的字符串,用来指定窗口的层次、位置和大小。
其中,”g”代表窗口的层次,所有窗口普通层次的值都为0;”x”和”y”分别是窗口的横、竖坐标;”w”和”h”分别是窗口的宽度和高度。
五个参数都是整数,宽度和高度的值如果不需要改变,可以使用”-1″来代替。
<WIN>
缺省情况下,此参数表示一个字符串,所有标题中含有此字符串的窗口都是匹配项,忽略大小写。
如果加上”-F”选项,则会检查大小写。
如果使用”-i”的选项,此参数将被当作一个整数来进行比较。
此参数有两个特殊值:”:SELECT:”表示命令执行后需要用户选择一个窗口作为目标,然后将命令作用到该窗口;”:ACTIVE:”表示将当前处于活动状态的窗口作为命令执行目标。
<WORKAROUND>
当前只实现了一个workaround属性,即”DESKTOP_TITLES_INVALID_UTF8″。
在使用Window Maker作为窗口管理器时可以修正打印非ASCII编码窗口标题的输出结果。
wmctrl选择目标窗口的选项并不如DP丰富和精确,不过大多数情况下并不影响使用,况且通过”<WIN>“参数的两个特殊值可以多少弥补一些选项上的缺失,且能提供一种更机动的操作方式。
当选择了目标窗口后,就要向该窗口指定具体行为了。
这一点通过”动作”来实现。
-a <WIN>
移动到该窗口所在的工作区,提升该窗口的层次,并将输入焦点置于该窗口上。
-b ( add | remove | toggle),prop1 [,prop2 ]
为选定窗口添加(add)、移除(remove)或切换(toggle)相应的一个或两个属性。
这些属性包括:modal, sticky(粘贴), maximized_vert(竖向最大化), maximized_horz(横向最大化), shaded(折叠),
skip_taskbar(不在任务栏中显示), skip_pager(不在pager中显示), hidden(隐藏), fullscreen(全屏), above(窗口置于最上层)和below(窗口置于最下层)。
-c <WIN>
试探性地关闭指定窗口。
-d
在终端中列出当前窗口管理器管理的所有虚拟桌面的详细信息。
-e <MVARG>
将窗口几何属性字符串应用到指定窗口。
-g w,h
改变窗口的宽度和高度。
-h
打印wmctrl的帮助信息到终端。
-I name
设定一个窗口的缩略名为”name”。
-k ” (” on ” | ” off ” )”
打开或关闭窗口管理器的”show the desktop”模式,如果该窗口管理器支持的话。
-l
在终端中列出当前所有窗口的属性。
如果使用了”-p”的参数,属性中将包含窗口的PID值;如果使用了”-G”参数,属性中将包含窗口的几何属性(横竖坐标、宽度和高度)。
-m
显示窗口管理器的信息。
-n N
改变当前虚拟桌面的数量。
-N name
改变指定窗口的标题。
-o x,y
改变指定窗口的”viewport”值,窗口管理器可能会忽略这个命令。
-r <WIN>
选择标题中含有相应字符串的窗口。
-R <WIN>
选择标题中含有指定字符串的窗口,将它移动到当前工作区,提升其层次并将输入焦点置于其上。
-s <DESK>
移动到该工作区。
-t <DESK>
将通过”-r”选定的窗口移动到指定工作区。
-T name
同时修改选定窗口的的标题和缩略名。
通过参数和动作,wmctrl已经可以控制大多数窗口的行为了。
同时,通过选项,wmctrl可以进一步细化这些行为。
-F
在通过”-r”进行窗口标题匹配时使用不忽略字母大小写的精确匹配。
-G
在通过”-l”动作输出窗口属性时,在输出结果中添加窗口几何属性。
-i
将窗口标题作为一个数字值进行比较。
-p
在通过”-l”动作输出窗口属性时,在输出结果中添加窗口PID属性。
-u
覆盖自动探测和强制UTF-8编码模式。
-v
打印详细的信息到终端,在调试wmctrl自身时很有用。
-w [ <WORKAROUND>[,<WORKAROUND>]… ]
在参数中使用指定的workaround属性值。
-x
在窗口列表中包含窗口class属性,或指定”<WIN>“为窗口的class值而非标题。
下面是一些wmctrl命令的例子:
wmctrl -l
列出当前所有窗口的信息。
wmctrl -p -G -l
列出包含窗口PID和几何属性信息的所有窗口信息。
wmctrl -a emacs
移动到标题中含有”emacs”字符串的窗口。
wmctrl -r mozilla -b add,shaded
将标题中含有”mozilla”的窗口折叠起来。
wmctrl -F -c ‘Debian bug tracking system – Mozilla’
将一个标题与给定字符串大小写匹配的窗口关闭。
wmctrl -i -r 0×0120002 -b add,sticky
将窗口标题按照数字值进行大小比较,然后将选定的窗口置为粘贴状态。
wmctrl -r :SELECT: -T “Selected Window”
选择一个窗口,然后将它的标题修改为”Selected Window”。
直接在终端中输入命令来控制窗口行为显得很笨拙,不过,我们可以通过设置热键来代替常用命令的输入,这就简便多了。