用VC++实现不规则窗口
- 格式:docx
- 大小:19.40 KB
- 文档页数:3
注:以下代码以一个名为CTest6Dlg的对话框类为例--------------------------------------------------------------------------------1. 在任务栏隐藏对话框ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);--------------------------------------------------------------------------------2. 使对话框为顶层窗口SetWindowPos(&this->wndTopMost, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);--------------------------------------------------------------------------------3. 在运行时添加最大化,最小化按钮SetWindowLong(this->m_hWnd, GWL_ST YLE,GetWindowLong(this->m_hWnd, GWL_ST YLE) |WS_MINIM IZEBOX | WS_MAXIMIZEBOX);UpdateWindow();--------------------------------------------------------------------------------4. 使能对话框右上角关闭按钮在OnInitDialog中方法一:CMenu* menu = GetSystemMenu(FALSE);menu->Modify M enu(SC_CLOSE, MF_BYCOMMAND | M F_GRAYED );方法二:CMenu* menu = GetSystemMenu(FALSE);menu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);--------------------------------------------------------------------------------5. 当对话框一部分在屏幕外时,显示全部对话框SendMessage(DM_REPOSITION);--------------------------------------------------------------------------------6. 改变鼠标外形添加WM_SETCURSOR 消息映射函数BOOL CTest6Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) {SetCursor(AfxGetApp()->LoadStandardCursor(IDC_HELP));return 0;}--------------------------------------------------------------------------------7. 改变对话框背景色和文本颜色在CTest6App的InitInstance中添加SetDialogBkColor(RGB(255,0,0), RGB(0,255,0));--------------------------------------------------------------------------------8. 改变对话框caption上的图标导入自己的图标资源到工程中,把原来ID为IDR_MAINFRAME 的资源删除,把新的图标的ID命名为IDR_MAINFRAME --------------------------------------------------------------------------------9. 在主对话框显示前,显示一个login对话框BOOL CTest6App::InitInstance(){//...int nResponse;CLoginDlg loginDlg;nResponse = loginDlg.DoModal();if (nResponse == IDOK){}if (nResponse == IDCANCEL){return FALSE;}CTest6Dlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse == IDOK ){}else if (nResponse == IDCANCEL){}return FALSE;}然后重载CLoginDlg对话框的哦OnOK(),在其中判断条件void CLoginDlg::OnOK(){if (条件满足)CDialog::OnOK();elseAfxMessageBox(_T("invalid password!"));}--------------------------------------------------------------------------------10. 在对话框中添加工具栏方法一:添加以下代码到OnInitDialog 中if ( !m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1) ){TRACE0("Failed to Create Dialog Toolbar\n");EndDialog(IDCANCEL);}CRect rcClientOld; // 久客户区RECTCRect rcClientNew; // 加入TOOLBAR后的CLIENT RECTGetClientRect(rcClientOld); //// Called to reposition and resize control bars in the client area of a window// The reposQuery FLAG does not really traw the Toolbar. It only does the calculations.// And puts the new ClientRect v alues in rcClientNew so we can do the rest of the Math.//重新计算RECT大小RepositionBars(AFX_IDW_CONT ROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rcClientNew);// All of the Child Windows (Controls) now need to be moved so the Tollbar does not cov er them up. //所有的子窗口将被移动,以免被TOOLBAR覆盖// Offest to move all child controls after adding Tollbar//计算移动的距离CPoint ptOffset(rcClientNew.left-rcClientOld.left,rcClientNew.top-rcClientOld.top);CRect rcChild;CWnd* pwndChild = GetWindow(GW_CHILD); //得到子窗口while(pwndChild) // 处理所有子窗口{//移动所有子窗口pwndChild->GetWindowRect(rcChild);ScreenToClient(rcChild);rcChild.OffsetRect(ptOffset);pwndChild->MoveWindow(rcChild,FALSE);pwndChild = pwndChild->GetNextWindow();}CRect rcWindow;GetWindow Rect(rcWindow); // 得到对话框RECTrcWindow.right += rcClientOld.Width() - rcClientNew.Width(); // 修改对话框尺寸rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height();Mov eWindow(rcWindow,FALSE); // Redraw WindowRepositionBars(AFX_IDW_CONT ROLBAR_FIRST,AFX_IDW_CONT ROLBAR_LAST,0);方法二:/dialog/dlgtoolstatusbar.asp--------------------------------------------------------------------------------11.响应对话框的最大化、最小化、关闭、恢复事件方法一:添加WM_SYSCOMMAND 消息映射函数v oid CTest6Dlg::OnSysCommand(UINT nID, LPARAM lParam) {if ( (nID & 0xFFF0) == IDM_ABOUTBOX ){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{if ( nID == SC_MAXIMIZE ){AfxMessageBox(_T("最大化"));}else if ( nID == SC_MINIMIZE ){AfxMessageBox(_T("最小化"));}else if ( nID == SC_CLOSE ){AfxMessageBox(_T("关闭"));}CDialog::OnSysCommand(nID, lParam);}方法二:添加WM_SIZE 消息映射函数v oid CTest6Dlg::OnSize(UINT nT y pe, int cx, int cy){CDialog::OnSize(nT y pe, cx, cy);if ( nT y pe == SIZE_MAXIM IZED ){AfxMessageBox(_T("最大化"));}else if ( nT ype == SIZE_MINIMIZED ){AfxMessageBox(_T("最小化"));}else if ( nT ype == SIZE_RESTORED ){AfxMessageBox(_T("恢复"));}}--------------------------------------------------------------------------------12.代码实现窗口最小化,最大化,关闭PostMessage(WM_SYSCOMMAND, SC_MINIMIZE);PostMessage(WM_SYSCOMMAND, SC_MAXIMIZE);PostMessage(WM_SYSCOMMAND, SC_CLOSE);--------------------------------------------------------------------------------13.按下ESC和ENTER键时禁止关闭对话框方法一:(1) 重载OnCancel和OnOk,屏蔽其中的CDialog::OnCancel()和CDialog::OnOk();(2) 添加以下代码v oid CTest6Dlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout; //if you have an about dialogdlgAbout.DoModal();}else if ((nID & 0xFFF0) == SC_CLOSE){//用户点击右上角"X"EndDialog(IDOK);}else{CDialog::OnSysCommand(nID, lParam);}}方法二:BOOL CTest6Dlg::PreTranslateMessage(MSG* pM sg){if ( pMsg->message == WM_KEYDOWN ){switch(pMsg->wParam){case VK_ESCAPE:return T RUE; //直接返回TRUEbreak;case VK_RET URN:return T RUE;break;}}return CDialog::PreTranslateMessage(pM sg);}方法三:Q122489:How to Disable Default Pushbutton Handling for MFC Dialog/kb/122489/en-us--------------------------------------------------------------------------------14.在对话框中处理键盘鼠标消息处理PreTranslateMessage消息以下代码示例只演示了键盘WM_KEYDOWN消息,你也可以处理鼠标消息,比如WM_LBUTTONDOWN,WM_LBUTTONUP,WM_RBUTTONDOWN等。
qt实现不规则窗口的方法一、前言Qt是一个强大的跨平台开发框架,它提供了丰富的API和工具,使得开发者能够轻松地创建各种类型的应用程序。
在Qt中,窗口是应用程序的重要组成部分,而不规则窗口的实现则可以让应用程序更加具有个性化和视觉吸引力。
本文将介绍如何使用Qt实现不规则窗口的方法。
二、不规则窗口的实现方法1. 使用自定义窗口类在Qt中,可以通过继承QMainWindow或QDialog类,并重写其中的一些方法来实现不规则窗口。
首先,需要定义一个自定义窗口类,并在其中重写windowRect()和sizeHint()方法,以获取窗口的尺寸和形状。
然后,可以使用setWindowFlags()方法来设置窗口的样式,以实现不规则窗口的效果。
2. 使用布局管理器Qt提供了多种布局管理器,如QHBoxLayout、QVBoxLayout、QGridLayout等,这些布局管理器可以根据需要自动调整窗口的大小和位置。
通过使用布局管理器,可以将不规则形状的窗口部件放置在窗口中,并自动调整窗口的大小和位置,以达到不规则窗口的效果。
3. 使用形状控件Qt提供了一些形状控件,如QFrame、QPushButton等,这些控件可以设置不同的形状,如矩形、圆形、椭圆形等。
通过将这些形状控件放置在窗口中,并使用布局管理器自动调整它们的位置和大小,可以实现不规则窗口的效果。
三、示例代码下面是一个简单的示例代码,展示了如何使用自定义窗口类和布局管理器实现不规则窗口:```cpp#include <QApplication>#include <QMainWindow>#include <QVBoxLayout>#include <QWidget>class IrregularWindow : public QWidget {public:IrregularWindow(QWidget *parent = nullptr) : QWidget(parent) {}void setShape(QRect rect) {m_shape = rect;update();}protected:void paintEvent(QPaintEvent *event) override {QPainter painter(this);painter.drawRect(m_shape);}private:QRect m_shape;};int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget *centralWidget = new QWidget;QVBoxLayout *layout = new QVBoxLayout(centralWidget);QWidget *widget1 = new IrregularWindow;widget1->setWindowFlags(widget1->windowFlags() | Qt::FramelessWindowHint);widget1->setShape(QRect(50, 50, 200, 100));layout->addWidget(widget1);QWidget *widget2 = new QPushButton("Button");layout->addWidget(widget2);QWidget *widget3 = new QFrame(centralWidget);widget3->setFrameShape(QFrame::Rectangle);layout->addWidget(widget3);centralWidget->show();return app.exec();}```在上面的代码中,我们创建了一个自定义窗口类IrregularWindow,它继承自QWidget,并重写了paintEvent()方法来绘制自定义的形状。
VC控件随窗口大小变化而变化的方法在VC中,控件随窗口大小变化而变化的方法有多种实现方式。
下面将介绍一种比较常用的方法。
方法一:使用控件的锚点属性3.根据需要,可以调整锚点的位置和大小。
4. 在对话框的OnSize函数中添加控件调整的代码。
示例代码如下:```void CMyDialog::OnSize(UINT nType, int cx, int cy)CDialogEx::OnSize(nType, cx, cy);//获取对话框的客户区大小CRect rect;GetClientRect(&rect);//调整控件的大小和位置m_btnOK.SetWindowPos(NULL, rect.right - 100, rect.bottom - 100, 0, 0, SWP_NOZORDER , SWP_NOSIZE);```在这个示例代码中,m_btnOK是一个按钮控件的变量。
调用SetWindowPos函数可以设置控件的位置和大小。
rect.right和rect.bottom分别表示对话框客户区的右边界和底边界的坐标。
在此示例中,按钮的右下角离对话框的右下角保持了100个像素的距离。
需要注意的是,OnSize函数中必须调用基类的OnSize函数,以确保窗口的基本布局正常。
总结:使用锚点属性和OnSize函数可以实现控件随窗口大小变化而变化。
通过设置锚点的位置和大小,再在OnSize函数中根据对话框的大小调整控件的大小和位置,可以适应不同窗口大小的需求。
这种方法是比较简单、快速实现的方式,特别适用于需要调整的控件数量较少的情况。
除了使用锚点属性和OnSize函数外,还可以使用其他方式实现控件随窗口大小变化,比如使用MoveWindow函数或者使用布局管理器等。
在实际开发中,需要根据具体情况选择合适的方法。
如何使⽤visualstudio2019创建简单的MFC窗⼝(使⽤C++)本⽂介绍了如何使⽤visual studio2019创建简单的MFC窗⼝(使⽤C++)```cpp使⽤visual studio 2019 创建过程请参考Bili的上⼀篇⽂章⬇⬇→!使⽤visual studio 2019 创建简单的MFC窗⼝「使⽤底层的C语⾔」#include<windows.h> //底层实现窗⼝的头⽂件//6.处理窗⼝过程//CALLBACK 代表_stdcall 参数的传递顺序:从右到左依次⼊栈,并且函数返回前清空堆栈LRESULT CALLBACK WindowProc(HWND hand, //消息所属窗⼝句柄UINT uMsg, //具体消息名称 WM_XXXX消息名WPARAM wParam, //键盘附加消息LPARAM lParam) { //⿏标附加消息switch (uMsg){case WM_CLOSE://所有以XXXXWindow为结尾的⽅法,都不会进⼊到消息队列中,⽽是直接执⾏DestroyWindow(hand);//发送另⼀个消息WM_DESTROYbreak;case WM_DESTROY:PostQuitMessage(0);break;case WM_LBUTTONDOWN://⿏标左键按下{int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);char buf[1024];wsprintf(buf, TEXT("x = %d,y = %d"),xPos,yPos);MessageBox(hand, buf, TEXT("按下⿏标左键"), MB_OK);break;}case WM_KEYDOWN: //键盘{MessageBox(hand, TEXT("键盘"), TEXT("按下键盘"), MB_OK);break;}case WM_PAINT: //画图{PAINTSTRUCT ps; //画图结构体HDC hdc = BeginPaint(hand, &ps);TextOut(hdc, 100, 100,TEXT("hello"), strlen("hello"));EndPaint(hand, &ps);break;}default:break;}//返回值⽤默认处理⽅式return DefWindowProc(hand, uMsg, wParam, lParam);}/*程序⼊⼝函数_In_ HINSTANCE hInstance,//应⽤程序实例句柄_In_opt_ HINSTANCE hPrevInstance,//上⼀个应⽤程序句柄,在WIN32环境下⼀般为NULL,不起作⽤了_In_ LPSTR lpCmdLine,//char * argv[]_In_ int nShowCmd//显⽰命令最⼤化、最⼩化、正常WINAPI 代表_stdcall 参数的传递顺序:从右到左依次⼊栈,并且函数返回前清空堆栈*/int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) {/*1.设计窗⼝2.注册窗⼝3.创建窗⼝4.显⽰和更新5.通过循环取消息6.处理消息(窗⼝过程)*///1.设计窗⼝WNDCLASS wc;wc.cbClsExtra = 0; //类的额外的内存wc.cbWndExtra = 0; //窗⼝额外的内存wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景wc.hCursor = LoadCursor(NULL, IDC_HAND); //设置光标,如果第⼀个参数为null,代表使⽤系统提供的光标wc.hIcon = LoadIcon(NULL, IDI_ERROR); //图标,如果第⼀个参数为null,代表使⽤系统提供的图标wc.hInstance = hInstance; //应⽤程序的实例句柄,传⼊winmain的形参即可wc.lpfnWndProc = WindowProc; //回调函数窗⼝过程wc.lpszClassName = TEXT("WIN"); //指定窗⼝名称wc.lpszMenuName = NULL; //菜单名称wc.style = 0; //显⽰风格,0代表默认//2.注册窗⼝RegisterClass(&wc);//3.创建窗⼝/*lpszClassName,//类名lpWindowName, //标题名dwStyle, //风格 WC_OVERLAPPEDWINDOWx, //坐标 CW_USERDEFAULTy, //坐标nWidth, //宽nHeight, //⾼hWndParent, //⽗窗⼝ nullhMenu, //菜单 nullhInstance, //实例句柄lpParam //附加值⿏标附加值*/HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); //4.显⽰和更新ShowWindow(hwnd, SW_SHOWNORMAL);UpdateWindow(hwnd);/*HWND hwnd; //主窗⼝句柄UINT message; //具体消息名称WPARAM wParam; //附加消息键盘消息LPARAM lParam; //附加消息⿏标消息DWORD time; //消息产⽣时间POINT pt;*/ //附加消息⿏标消息 x,y//5.通过循环取消息MSG msg;/*_Out_ LPMSG lpMsg, //消息_In_opt_ HWND hWnd, //捕获窗⼝填null表⽰捕获所有窗⼝_In_ UINT wMsgFilterMin, //最⼤和最⼩的过滤消息⼀般填0_In_ UINT wMsgFilterMax);*/while (GetMessage(&msg, NULL, 0, 0)){/*if (GetMessage(&msg, NULL, 0, 0) == FALSE) {break;}*///翻译消息TranslateMessage(&msg);//不是false//分发消息DispatchMessage(&msg);}return 0;}划重点:项⽬->属性->常规->⾼级->将MFC的使⽤设置为在“共享dll中使⽤mfc”头⽂件mfc.h#include <afxwin.h>//mfc头⽂件class MyApp:public CWinApp{public:virtual BOOL InitInstance();};class MyFrame :public CFrameWnd {//窗⼝框架类public:MyFrame();//声明宏提⽰消息映射机制DECLARE_MESSAGE_MAP();afx_msg void OnLButtonDown(UINT,CPoint);afx_msg void OnChar(UINT,UINT,UINT);afx_msg void OnPaint();};源⽂件mfc.cpp#include “mfc.h”MyApp app;BOOL MyApp::InitInstance() {//创建窗⼝MyFrame* frame = new MyFrame;//显⽰和更新frame->ShowWindow(SW_SHOWNORMAL);frame->UpdateWindow();m_pMainWnd = frame;//保存指向应⽤程序的主窗⼝的指针return TRUE;//返回正常初始化}//分界宏BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)ON_WM_LBUTTONDOWN()//⿏标左键按下ON_WM_CHAR()ON_WM_PAINT()END_MESSAGE_MAP()MyFrame::MyFrame(){Create(NULL,TEXT(“windows”));}void MyFrame::OnLButtonDown(UINT, CPoint point){//TCHAR buf[1024];//wsprintf(buf, TEXT(“x = %d,y = %d”), point.x, point.y);//MessageBox(buf);CString str;str.Format(TEXT(“x = %d,y = %d”),point.x,point.y);MessageBox(str);}void MyFrame::OnChar(UINT key, UINT, UINT){CString str;str.Format(TEXT(“按下了%c键”),key);MessageBox(str);}void MyFrame::OnPaint(){CPaintDC dc(this);dc.TextOutW(100,100,TEXT(“为了部落”));dc.Ellipse(10,10,100,100);}到此这篇关于如何使⽤visual studio2019创建简单的MFC窗⼝(使⽤C++)的⽂章就介绍到这了,更多相关vs2019创建MFC窗⼝内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
SetWindowRgn,CreateRectRgnIndirect,CreateEllipticRgnIndirect,CreatePolygonRgn,CombineRgnVC++提供了CRgn类和SetWindowRgn()函数来实现不规则的程序窗口。
创建一个不规则窗口的过程是:首先定义一个CRgn类,并用各种初始化函数创建CRgn类的具体区域,然后调用CWnd::SetWindowRgn()函数创建不规则窗口。
CRgn是从CgdiObject衍生出来的类,用来确定一个多边形、椭圆或者由多边形及椭圆合成的范围,在程序中主要会用到CreateRectRgnIndirect()、CreateEllipticRgnIndirect()、CreatePolygonRgn()三个函数。
CreateRectRgnIndirect(LPCRECT lpRect)函数创建一个矩形区域,参数lpRect指定所创建的矩形区域在窗口用户区中的left(左)、top(上)、right(右)、bottom(下)坐标。
例如:CRgn MyRgn;RECT m_rect;m_rect.left=0; m_rect.top=0; m_rect.right=500; m_rect.bottom=300;MyRgn.CreateRectRgnIndirect( &m_rect );CreateEllipticRgnIndirect(LPCRECT lpRect)函数创建一个椭圆形区域,参数lpRect指定所创建的椭圆形区域在窗口用户区中的left(左)、top(上)、right(右)、bottom(下)坐标,如果指定right 坐标与left坐标之差等于bottom坐标与top坐标之差,则创建的区域是一个圆。
例如:CRgn MyRgn;RECT m_rect;m_rect.left=0; m_rect.top=0; m_rect.right=500; m_rect.bottom=300;MyRgn.CreateEllitpticRgnIndirect( &m_rect );CreatePolygonRgn(LPPOINT lpPoints, int nCount, int nMode)函数创建一个多边形区域,参数lpPoints指向一个POINT结构数组,在POINT结构数组中每个POINT结构项,用来确定多边形顶点在窗口用户区中的坐标;nCount说明POINT结构数组中POINT结构项的数目,也就是多边形的顶点数;nMode指定多边形的填充方式,一般使用ALTERNATE方式。
VC显示关闭销毁模态与非模态对话框技巧VC++是一种用于Windows平台开发应用程序的集成开发环境,用于构建图形用户界面和控制应用程序的行为。
在VC++中,对话框是一种常用的用户界面元素,可以用于显示和获取用户输入。
在使用对话框时,要注意对话框的显示、关闭和销毁。
1.显示对话框在VC++中,显示一个对话框可以通过以下几种方式实现:a. 使用DoModal函数DoModal函数是CDialog类的一个成员函数,用于显示对话框,并返回对话框的返回值。
例如,可以使用下面的代码显示一个对话框:CMyDialog dlg;dlg.DoModal(;b. 使用Create函数Create函数是CDialog类的另一个成员函数,用于创建对话框,并显示它。
使用Create函数时,需要先调用Create函数创建对话框,然后调用ShowWindow函数显示对话框。
以下是使用Create函数显示对话框的示例代码:CMyDialog dlg;dlg.Create(IDD_MYDIALOG);dlg.ShowWindow(SW_SHOW);c.使用模态对话框模态对话框是一种阻塞式对话框,显示模态对话框时,在对话框关闭之前,用户无法与其他应用程序进行交互。
要显示一个模态对话框,可以通过调用DoModal函数,并传递对话框的资源ID来实现。
以下是使用模态对话框的示例代码:CMyDialog dlg;INT_PTR nResponse = dlg.DoModal(;2.关闭对话框在VC++中,可以使用以下几种方式关闭对话框:a. 使用EndDialog函数EndDialog函数是CDialog类的一个成员函数,用于关闭对话框,并返回对话框的返回值。
以下是使用EndDialog函数关闭对话框的示例代码:OnOKEndDialog(IDOK);b.使用DestroyWindow函数DestroyWindow函数是CWnd类的一个成员函数,用于销毁窗口,并关闭对话框。
全屏显⽰是⼀些应⽤软件程序必不可少的功能。
⽐如在⽤VC++编辑⼯程源⽂件或编辑对话框等资源时,选择菜单“ViewFull Screen”,即可进⼊全屏显⽰状态,按“Esc”键后会退出全屏显⽰状态。
在VC++6.0中我们⽤AppWizard按默认⽅式⽣成单⽂档界⾯的应⽤程序框架。
下⾯将先讨论点击菜单项“ViewFull Screen”实现全屏显⽰的⽅法,再讲述按“Esc”键后如何退出全屏显⽰状态。
1)在CMainFrame类中,增加如下三个成员变量。
Class CMainFrame : public CFrameWnd { private: //⾃⼰添加的三个成员变量 WINDOWPLACEMENT m_OldWndPlacement; //⽤来保存原窗⼝位置 BOOL m_bFullScreen; //全屏显⽰标志 Crect m_FullScreenRect; //表⽰全屏显⽰时的窗⼝位置 protected: CMainFrame(); DECLARE_DYNCREATE(CMainFrame)} 2)在资源编辑器中编辑菜单IDR_MAINFRAME。
在“View”菜单栏下添加菜单项“Full Screen”。
在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。
还可以在⼯具栏中添加新的⼯具图标,并使之与菜单项“Full Screen”相关联,即将其ID值也设置为ID_FULL_SCREEN。
3)设计全屏显⽰处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的响应函数。
响应函数如下: void CMainFrame::OnFullScreen() {GetWindowPlacement(&m_OldWndPlacement); Crect WindowRect; GetWindowRect(&WindowRect); Crect ClientRect; RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect); ClientToScreen(&ClientRect); //获取屏幕的分辨率 int nFullWidth=GetSystemMetrics(SM_CXSCREEN); int nFullHeight=GetSystemMetrics(SM_CYSCREEN); //将除控制条外的客户区全屏显⽰到从(0,0)到(nFullWidth, nFullHeight)区域, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗⼝和除控制条之外的客户区位置间的差值, 就得到全屏显⽰的窗⼝位置 m_FullScreenRect.left=WindowRect.left-ClientRect.left; m_FullScreenRect.top=WindowRect.top-ClientRect.top; m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth; m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight; m_bFullScreen=TRUE; //设置全屏显⽰标志为 TRUE //进⼊全屏显⽰状态 WINDOWPLACEMENT wndpl; wndpl.length=sizeof(WINDOWPLACEMENT); wndpl.flags=0; wndpl.showCmd=SW_SHOWNORMAL; wndpl.rcNormalPosition=m_FullScreenRect; SetWindowPlacement(&wndpl);} 4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显⽰时提供全屏显⽰的位置信息。
改变窗口的外观和大小改变窗口的外观和大小需要在窗口创建以前改变。
所以我们可以在CMainFrame的PreCreateWindow中改变CREATESTRUCT 结构体的值就行了。
E.G.BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)改变窗口的大小-> cs.cx = 300; cs.cy = 200;改变窗口的显示位置坐标是 cs.x 和 cs.y这里常用的一个函数是::GetSysMetrics(SM_CXSCREEN);::GetSysMetrics(SM_CYSCREEN);用来取得屏幕的大小。
要改变窗口标题栏的字符串:cs.lpszName = "Seven"; 会发现标题栏不会改变窗口的标题栏的上的字符串。
改变单文档应用程序的标题栏的字符串参考MSDN windowstyles/Frame-window styles 下面有一个Changing the styles of a window create by MFC./ The SDI Case默认的情况是WS_OVERLAPPEDWINDOW and FWS_ADDTOTITLE styles FWS_ADDTOTITLE is add the document title to the window’s caption.去掉FWS_ADDTOTITLE 就可以更改窗口标题栏字符串。
cs.style &= ~FWS_ADDTOTITLE;cs.lpszName = "Seven";如果我们需要改变背景,画刷,光标等等时候。
我们可以在:PreCreateWindow中创建窗口类,WNDCLASS wndClass;把这个类里的值改变成自己想要的内容就可以了。
E.G.wndClass.cbClsExtra = 0;wndClass.cbWndExtra = 0;wndClass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);wndClass.hCursor = LoadCursor(NULL, IDC_WAIT);wndClass.hIcon = LoadIcon(NULL, IDI_WARNING);wndClass.hInstance = AfxGetInstanceHandle();获取应用程序的实例句柄可用AfxGetInstanceHandle函数,这个函数是一个全局的函数,前面有一个AFX表示是一个应用程序框架类函数,哪里都可用。
⽤C#写windows窗⼝的界⾯⽤C#写windows窗⼝的界⾯:⾸先要规划好界⾯布局,要⽤到哪些控件,这些控件的属性和事件的使⽤⽅法。
1.MenuStrip控件编辑菜单栏:在菜单项之间插⼊分隔条,⾸先选中第⼆个菜单项,⿏标右击,选择“插⼊”->Separator命令。
菜单的Name属性最好与实际意思相符,因为事件的名字代码就是以此命名的。
2.Button按钮有⼀个DialogResult属性,他⼜ok,concel,yes,No等值,这些值可以作为按钮所在窗⼝的返回值,从⽽窗体要出发的事件。
3. ListBox控件的Items,可以编写集合。
但是编写的是固定的,如果要动态添加,则要⽤到ListBox.Items.Add();函数。
改控件还有insert(),remove(),selectedItem(),selectedIndex()等⽅法。
4.颜⾊对话框是集成的控件。
可⽤按钮出发事件,⽤ColorDialog cd = new ColorDialog();来创建颜⾊窗⼝,选择的颜⾊可以⽤textBox 的背景⾊来表⽰。
调⽤cd.showDialog()⽅法时,直到关闭对话框后,才执⾏此⽅法后⾯的代码。
可以将枚举值之⼀分配给对话框,⽅法是将该值分配给窗体上的属性或通过使⽤代码设置窗体的属性(l例如cd.showDialog()== DialogResult.ok)。
5.numericUpDowna控件,上增下减,数字表⽰6.要在窗体上画图,最好使⽤pictureBox控件的Paint事件。
画图时要⽤到system.Drawing.Graphics 类库,例如Graphics g = e.Graphics;(注意PaintEventArgs e)然后g可以调⽤ g.DrawLine(new Pen(mColor, mPenWidth), 10, 20, 200,20) ;其中Pen是画笔,Pen()函数有两个参数:颜⾊和宽度。
用VC++实现不规则窗口
随着Windows95的推出,在PC系统中出现了越来越多的应用程序采用了非矩
形外观的窗体,或者模拟现实中的事物,如钟、眼睛等;或者创造一个具有三维观感的非现实物体,这类程序以各种mp3播放器为代表,甚至一些大腕级的老牌应用程序(如Norton),也开始拥有这种窗口。
一来是因为Windows操作系统和
各类开发工具自身功能的极大提升;二来,也说明开发人员希望通过与众不同的外观,来强调使用时的第一映像,以期达到吸引用户的目的,毕竟,现在的PC 是
一个充满图形(图象)的世界,充分利用这一特点,也能在一定程度上改善程序界面的可操作性。
而且,对于同一类型的应用程序,在功能、性能相差不大的情况下,用户也往往愿意选择外观漂亮的那种。
因而,很多文章都在介绍如何创建不规则的窗口,但几乎千篇一律地基于VB进行说明。
而笔者本人一直基于C/C++ 语言进行开发,因此,研究了一下在VC++5中实现不规则窗口的方法,下面就实现的主要方法进行说明。
VC++5提供了CRgn类和SetWindowRgn()函数来实现不规则的程序窗口。
创建
一个不规则窗口的过程是:首先定义一个CRgn类,并用各种初始化函数创建CRgn 类的具体区域,然后调用CWnd::SetWindowRgn()函数创建不规则窗口。
CRgn是从CgdiObject衍生出来的类,用来确定一个多边形、椭圆或者由多边
形及椭圆合成的范围,在程序中主要会用到CreateRectRgnIndirect()、CreateEllipticRgnIndirect()、CreatePolygonRgn()三个函数。
CreateRectRgnIndirect(LPCRECT
lpRect)函数创建一个矩形区域,参数lpRect指定所创建的矩形区域在窗口用户区
中的left(左)、top(上)、right(右)、bottom(下)坐标。
例如:CRgnMyRgn;
RECT m_rect;
m_rect.left=0; m_rect.top=0; m_rect.right=500; m_rect.bottom=300; MyRgn.CreateRectRgnIndirect(&m_rect );
CreateEllipticRgnIndirect(LPCRECT
lpRect)函数创建一个椭圆形区域,参数lpRect指定所创建的椭圆形区域在窗口用户区中的left(左)、top(上)、right(右)、bottom(下)坐标,如果指
定right坐标与left坐标之差等于bottom坐标与top坐标之差,则创建的区域是一
个圆。
例如:
CRgnMyRgn;
RECT m_rect;
m_rect.left=0; m_rect.top=0; m_rect.right=500; m_rect.bottom=300; MyRgn.CreateEllitpticRgnIndirect(&m_rect );
CreatePolygonRgn(LPPOINT lpPoints, intnCount, int
nMode)函数创建一个多边形区域,参数lpPoints指向一个POINT结构数组,
在POINT结构数组中每个POINT结构项,用来确定多边形顶点在窗口用户区中的坐标;nCount说明POINT结构数组中POINT结构项的数目,也就是多边形的顶点
数;nMode指定多边形的填充方式,一般使用ALTERNATE方式。
例如创建一个三角形:
CRgnMyRgn;
POINT Points[3];
Points[0].x=Points[0].y=0; Points[1].x=10; Points[1].y=30;
Points[2].x=5; Points[2].y=60;
MyRgn.CreatePolygonRgn(Points, 3, ALTERNATE);
利用以上的函数创建区域后,就可以调用CWnd::SetWindowRgn(HRGN hRgn, BOOL
bRedraw)来创建非矩形的窗口了。
SetWindowRgn()函数参数说明:hRgn是一个CRgn类
的句柄;bRedraw如果被设置成TRUE,那么,在窗口次序发生变化时,系统会发送WM_WINDOWPOSCHANGING和WM_WINDOWPOSCHANGED消息给窗口。
如果要创建外形更复杂的窗口,例如mp3播放器Soniq的一个播放界面,就是
两个圆形部分重合形成的。
对于这类窗口的创建,还要用到CRgn类另外一个极其
重要的函数——CombineRgn()。
首先要说明的是:在VC++5的在线帮助中,将这个
函数归入了初始化(Initialization)类型中,实际上,如果定义的CRgn类在没
有使用其它初始化函数初始化之前,就调用这个函数的话,程序将会失败,所以,这个函数似乎应该归入operation类更恰当。
CombineRgn(CRgn* pRgn1, CRgn* pRgn2, int
nCombineMode)函数用来创建一个由多个多边形、椭圆合成的不规则区域。
pRgn1、pRgn2分别指向参与合成不规则区域的多边形或椭圆形;nCombineMode 说
明合成的方式:RGN_AND最后的区域是pRgn1和pRgn2的重叠部分;RGN_DIFF
最后
的区域是pRgn1中不包含pRgn2的部分;RGN_OR最后的区域同时包含pRgn1和pRgn2;RGN_XOR最后的区域同时包含pRgn1和pRgn2,但不包含pRng1和pRng2重
叠的部分。
例如,创建一个类似Soniq播放器的界面:
......
RECT m_Cyc1;
RECT m_Cyc2;
CRgn RgnCyc1;
CRgn RgnCyc2;
CRgnRgnDlg;
m_Cyc1.left=100; m_Cyc1.top=5; m_Cyc1.right=200; m_Cyc1.bottom=105;
m_Cyc2.left=80; m_Cyc2.top=85; m_Cyc2.right=180; m_Cyc2.bottom=185; RgnDlg.CreateEllipticRgnIndirect(&m_Cyc1 );
RgnCyc1.CreateEllipticRgnIndirect(&m_Cyc1 );
RgnCyc2.CreateEllipticRgnIndirect(&m_Cyc2 );
bineRgn(&RgnCyc1, &RgnCyc2, RGN_OR );
MyWin.SetWindowRgn( (HRGN)RgnDlg, TURE );
......
以上就是利用VC++5实现不规则窗口的方法,相信大家看后都能创造出各种希奇古怪的窗口来,但是,有一点应该提请注意:对于Windows操作系统而言,桌面上窗口的形状存储在内存中,所以,窗口外形的复杂程度应该适可而止,不要超过32767╳32767个逻辑单元,或者64K存储区。
当然,还有一点很重要:就是给窗口一张漂亮的脸,最好具有三维立体效果。