WINDOW程序设计第3章
WINDOWS 程序设计教程(4章)
} RECT;
4.7代号(句柄)
• 代号(句柄)是什么?
内核对象及其句柄
1 内核对象的作用
在内核以外有很多的系统组件,处理它们的资源分配、 安全认证等都要执行体付出不可忽略的策略开销。内核通过 一组称作“内核对象”的简单对象帮助控制、处理并支持执 行体对象的创建,以降低这种开销。大多数执行体级别的对 象都封装了一个或多个内核对象。 2 内核对象的种类 一个称作“控制对象”的内核对象集合为控制各种操作 系统功能建立了语义。这个对象集合包括内核进程对象、窗 口、文件和几个由I/O系统使用的对象(例如中断对象)等。
内核对象的映射关系。程序几乎总是通过调用Windows函数
来取得和使用句柄,以使用它代表的内核对象。
当调用一个创建内核对象的函数时,该函数就返回一
个用于标识该对象的句柄。然后我们的程序中就可以使用 这个句柄,将这个句柄传递给Windows的各个对内核对象进 行操作的函数,这样,系统就能知道你想操作哪个内核对 象。例如: HANDLE CreateFile(
HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32];
} PAINTSTRUCT;
4.6 RECT介绍
typedef struct _RECT {
LONG left; LONG top; LONG right; LONG bottom;
•
•
4.3 窗口类结构WNDCLASS
• 窗口类结构与窗口类的联系和区别? • 窗口类结构是内定的。
4.3 窗口类结构WNDCLASS
WNDCLASS的实现 虚拟窗口类结构WNDCLASS分别取作WNDCLASSA或WNDCLASSW。 它们的实现软件如下: #ifdef UNICODE//如果是UNICODE码 typedef WNDCLASSW WNDCLASS ; typedef PWNDCLASSW PWNDCLASS ;//指针 typedef NPWNDCLASSW NPWNDCLASS ;//近指针 typedef LPWNDCLASSW LPWNDCLASS ;//长指针 #else //不是UNICODE码 typedef WNDCLASSA WNDCLASS ; typedef PWNDCLASSA PWNDCLASS ;//指针 typedef NPWNDCLASSA NPWNDCLASS ;//近指针 typedef LPWNDCLASSA LPWNDCLASS ;//长指针 #endif
windows程序设计
消息驱动运行中发生的各种事件(鼠标键盘输入,各种状态的改变等),以消息的形式通知Windows系统Windows系统接收消息,提交给发生事件的应用程序应用程序的窗口处理函数负责处理响应收到的消息处理完成后继续等待下一个消息API application programming Interface SDK software Development kit 事件是用户对计算机操作的动作或程序中某个对象的状态发生的变化,每个事件对应一个消息,即每个事件发生的效果是产生消息消息是描述事件发生的信息事件驱动程序执行的顺序不是事先规定的,而是由事件的发生来控制在程序执行过程中,当某个对象的状态发生变化,或有外部输入等情况发生,则产生相应的事件当事件产生时,系统会发出特定的消息编写程序时可以对这些消息做出反应,也可以不做出;若要做出反应(即响应消息),则把响应此消息的程序写在与此消息相关联的函数中在程序执行时,一旦产生了一个消息,会调用与此消息相关联的函数窗口是Windows应用程序基本的操作单位,是应用程序与用户之间交互的接口,也是系统管理应用程序的基本单位消息传输事件发生,产生消息消息保存到消息队列分配给应用程序消息队列消息循环提取消息窗口函数响应消息MFC Microsoft foundation class MFC应用程序框架提供了一般应用程序需要的全部面向对象软件组件的集成集合MFC程序结构基于框架窗口的应用程序(早期的MFC)程序运行管理、窗口及数据管理分开两部分,与SDK程序类似基于文档/视图的应用程序单文档应用程序(重点)程序运行管理、窗口管理、交互管理、数据管理分开基于对话框的应用程序程序运行管理、对话框管理分开目前的MFC应用程序都采用文档/视图结构,把原来窗口框架类的工作分开窗口框架类管理窗框视图类(即视窗类)管理数据显示、接收用户输入文档类负责数据管理文档视图架构的思想数据嵌入文档中,利用文档的架构管理文档与视图通信,使数据在视图中显示视图显示数据,并与用户交互视图放入窗口中文档模板类对象管理上述对象协调工作CDocument是负责管理数据的类应用程序中的文档类是这个类的派生类作用数据管理程序员应将用户的实际数据对象内嵌在自己的文档类中需要与自己的视图类通信在程序中实现CDocument的派生类,以便嵌入数据对象,并改写成员函数实现对数据的处理用于派生应用程序的视图类CView 作用处理与用户的交互显示文档类中的数据接收用户输入(例如鼠标操作)通常要改写视图类的成员函数OnDraw或OnPrint,实现数据显示框架自动调用OnDraw函数WM_PAINT消息OnPaint()OnDraw() 菜单及响应利用菜单编辑器修改IDR_MAINFRAME 菜单资源在相应的类中为新菜单项映射消息COMMAND单击或用快捷键选中时生产UPDATE_COMMAND_UI上一级菜单显示前生产用于控制菜单状态编写新菜单项的消息处理函数快捷键在菜单项标题后面加“(&字母)”菜单动态为要添加的菜单项定义一个宏(例如ID_MENU1)用CWnd::GetMenu( )获得指向菜单条的指针(如果在子菜单上添加,应用CMenu::GetSubMenu()获得该菜单的指针)为菜单项手工映射消息处理函数在适当的地方调用InsertMenu或AppendMenu添加菜单项调用CWnd::DrawMenuBar()函数重画菜单动态删除菜单项与上面类似(使用DeleteMenu函数)动态创建菜单项用函数BOOL CreateMenu( );获得新菜单句柄,再用此句柄当作AppendMenu函数的第2个参数(需进行(UTIN)强制类型转换)通常用于创建弹出式菜单的顶级(不需映射消息)快捷菜单建立菜单如果菜单已经存在,且功能齐全,只需确定弹出方式即可也可以另加一个菜单资源,此法可使菜单条中不显示快捷菜单关联类(对于新加菜单)把此菜单资源关联到视图类上选中此菜单资源的情况下打开类向导,选视图类影射消息并编写消息处理函数选择弹出方式可在视图类的WM_CONTEXTMENU消息(鼠标右键单击客户区时产生)处理函数中弹出Windows系统有一个存放消息的队列每个应用程序也有一个消息队列Windows系统先将收到的消息存放在系统队列中,然后再分发到相应的应用程序队列中应用程序则从自身的队列中获取消息并进行处理类的消息响应一个类要响应多种消息对于每一种消息最重要的是知道是哪个消息:消息的标识(ID 身份证)这个消息对应的响应函数是什么(函数的起始地址)解决的办法建立一个结构体数组(消息映射表)一行(一个数组元素)是一个消息的信息每行至少包含消息的标识(ID)指向响应函数的指针消息的响应当收到消息后,根据消息ID在表中查找,找到后调用对应的消息处理函数消息路由当一个类收到消息后,先在自己的消息映射表中搜索,搜索到就执行相应的消息处理函数,然后结束消息处理过程未搜到,则到上一层基类中搜索,依此类推如果都未搜到,则交给系统默认的窗口处理函数去处理消息种类窗口消息命令消息控件通知消息实现消息映射消息映射的要点为每个要响应的消息建立一个处理函数为每个能够响应消息的类建立一个结构类型的数组(消息映射表)并填写这个数组编写每个消息处理函数的代码声明消息处理函数afx_msg void 函数名( ); //有些有返回值或参数(特别是窗口消息)对于窗口消息格式:ON_消息ID( )对于命令消息格式:ON_COMMAND(产生消息对象的ID,函数名)对于控件通知消息格式:ON_通知码(控件ID,函数名)在类的实现文件中为每个消息处理函数编写代码用户自定义消息何时用当程序运行到某个节点,需要发出一个消息要做的事:需要有一个消息标示(ID)需要一个消息处理函数把消息ID和消息处理函数填写到类的消息映射表中为消息处理函数编写代码在需要发出消息的程序代码处发出该消息不能使用类向导用户自定义消息方法定义一个消息ID(宏)声明消息处理函数在类的声明文件中(.h文件)afx_msg void OnMyMessage( ); 说明:根据需要决定是否有返回值、参数填写消息映射表编写消息响应函数在类的程序文件中(.cpp文件)void CMyMsgView::OnMyMessage( ) {……}在需要发出消息的地方用CWnd ::SendMessage发出消息Message ——消息ID也可用CWnd ::PostMessage函数(参数相同,返回值类型:BOOL)区别将消息放置在消息队列的末尾,不等待窗口处理该消息就直接返回SendMessage():发送消息,且一直等待窗口处理完该消息之后才返回对话框对话框是一种资源,使用时要用一个CDialog类的派生类与它相关联CDialog类是CWnd类的派生类,所以对话框是一个窗口CDialog类封装了对话框常用操作的功能函数对话框是窗口的集合,上面放置各种控件控件所对应的类是CWnd类的派生类控件是对话框窗口的子窗口种类模式对话框对话框弹出后,只能进行对话框操作,不能进行其他窗口的操作,直到本对话框被关闭无模式对话框对话框弹出后,可以进行其他窗口的操作(可以与其他窗口切换操作)模式对话框创建用对话框编辑器设计对话框(包括上面的控件)为对话框关联一个类(利用类向导)在相应打开对话框的类里面声明一个对话框类对象调用对话框对象的DoModal()成员函数来创建对话框,关闭对话框后对话框对象自动销毁CMyDlg dlg; dlg.DoModal( );可以根据DoModal()函数的返回值判断对话框关闭方式IDOK 表示按“确定”按钮(ID是IDOK)关闭IDCANCEL表示按“取消”按钮(ID是IDCANCEL )关闭CPasswordDlg dlg; if(dlg.DoModal( )==IDOK){ if(dlg.m_Password == "123456")......Else }非模式对话框创建、用Create函数创建调用ShowWindow函数显示对话框CMyDlg *pDlg; //声明对话框类指pDlg=new CMyDlg ; //动态创建对象pDlg->Create(对话框ID, this); //创建对话pDlg->ShowWindow(SW_SHOW); //显示对话框…//其他操作delete pDlg; //释放内存空间(对话框销毁)创建基于对话框的应用程序:用AppWizard创建应用程序用对话框编辑器设计界面(添加控件)用ClassWizard使控件与对象的关联用ClassWizard进行消息映射控件控件是对话框上或窗口上的子窗口每一类控件有自己的类,控件是该类对象所有控件都是窗口,所有控件类都由CWnd类派生使用对话框编辑器可以很方便地添加和删除控件控件产生“控件通知消息”,由它们的父类(承载窗口,例如对话框类)接收控件通知消息的处理函数是其父类的成员函数访问控件数据把控件当作窗口处理使用GetDlgItem(控件ID)获得指向控件的指针用GetWindowText获得该控件中的文本用SetWindowText设置该控件中的文本本方法不需要为控件关联变量对于有标题的控件(3种按钮、分组框等)处理的是标题对于编辑框、组合框、静态文本处理的是框中的文本CWnd *pEdit1=GetDlgItem(IDC_EDIT1);CString str;pEdit1->GetWindowText(str);pEdit1->SetWindowText("");pEdit2->SetWindowText(str);文档视图结构中类之间的访问应用程序类(由CWinApp派生)封装了初始化、创建窗口、消息循环等功能可以在虚函数InitInstance( )中添加程序代码窗口框架类CMainFrame(由CFrameWnd派生)负责标题栏、菜单、工具栏、状态栏的管理文档类(由CDocument派生)负责组织、管理数据视图类(由CView派生)负责与用户交互,显示文档类管理的数据用GetDocument( )返回文档类的指针通常在OnDrow( )函数中显示数据获得应用程序类对象地址在程序的任何地方,可以使用函数AfxGetApp()返回本程序的应用程序类对象的地址CWinApp* AfxGetApp( ); CWinApp是应用程序类的基类获得主框架类对象地址CWinApp类由CWinThread类派生CWinThread类有一个成员变量CWnd * m_pMainWnd指向应用程序线程主窗口对象对于基于文档视图的程序,指向主框架窗口对于基于对话框的程序,指向对话框窗口你的应用程序类继承了m_pMainWnd利用m_pMainWnd可以可以获得主框架窗口(或对话框窗口)对象的地址注意m_pMainWnd是CWnd类指针,应把它强制转换为你的主框架类指针(或对话框类指针)CMainFrame *m_p=(CMainFrame*)AfxGetApp()->m_pMainWnd;视图类中可以调用CWnd类函数获得其父框架类对象地址CFrameWnd* CWnd:: GetParentFrame( )在主框架类中获得视图类对象的地址对于SDI程序调用函数:CView *CFrameWnd::GetActiveView( )返回当前视图类对象的地址(应进行强制类型转换)若无当先视图,返回NULL对于MDI程序主框架窗口中无视图每个子框架窗口中才有视图要先找到当前框架窗口CMDIChildWnd* CMDIFrameWnd:: MDIGetActive( BOOL*pbMaximized = NULL ) const;或CFrameWnd* CFrameWnd::GetActiveFrame()再获得它的当前视图CView *CFrameWnd::GetActiveView( )在视图类中获得文档类对象的地址CDocument* CView::GetDocument( )获得其父框架类对象地址CFrameWnd* CWnd:: GetParentFrame( )在文档类中获得视图对象的地址先获得视图列表中第一个课件视图的位置使用文档类函数用返回的位置信息(POSITION 类型)获得该视图对象的地址使用文档类函数返回rPosition 所表示的视图的地址rPosition 变为下一个视图的位置,无下一视图rPosition为NULL POSITION pos = GetFirstViewPosition();while (pos != NULL) { CView* pView = GetNextView(pos); pView->UpdateWindow(); }文档与视图的相互作用在文档类中,当数据发生变化,要通知所有视图进行更新,用函数void UpdateAllViews( …); //参数见MSDN当CDocument::UpdateAllViews函数被调用时,会自动调用视图类函数:virtual void CView::OnUpdate(…); //参数见MSDN当应用程序启动时,或用户选择“新建”或“打开”菜单项时会自动调用视图类函数:virtual void CView::OnInitialUpdate( );可重载此函数初始化视图,以便适应新文档的需要当用户选择“新建”菜单项时,框架将先构造一个文档对象,然后调用文档类函数:virtual BOOL CDocument::OnNewDocument( ); 通常,用此函数设置文档数据程艳的初始值GDI(Graphics Device Interface)是Windows操作系统的重要部分,提供了绘图的基本工具,如画点、线、多边形、位图、文本输出等,负责Windows环境下的图形输出和图形模式下的文本输出DC(Device Context)为实现设备无关性,应用程序一般不直接向物理设备输出,而是面向一个虚拟逻辑设备,即DCDC是Windows 定义的一个数据结构,包含了向设备输出时所需要的绘图属性使用GDI函数之前,必须先创建一个DC设备环境类CDCMFC 对DC进行了封装,即CDC类CDC的基类是CObject 封装了GDI的所有绘图函数可利用CDC类对象在显示器和非显示设备(如打印机等)上输出CDC派生了几种不同的设备环境类CClientDC窗口客户区(窗口中客户可用部分)设备环境坐标(0,0)一般指客户区左上角绘图时可先调用CWnd类的GetClientRect()函数获得客户区的大小CWindowDC整个窗口的设备环境,可以在窗口的任何位置绘图坐标(0,0)指该窗口的左上角绘图时可先调用CWnd类的GetWindowRect()函数获得窗口在屏幕坐标系中的外边框坐标CPaintDC可对客户区和非客户区进行操作主要用于响应窗口重绘消息(WM_PAINT)的绘图DC在OnDraw函数中绘图void OnDraw(CDC * pDC);是使用应用程序向导生成SDI、MDI应用程序时视图类的成员函数由WM_PAINT消息处理函数OnPaint调用可以利用参数pDC 在此函数中绘图使用OnDraw函数绘图的好处窗口每次重绘,都可显示最新图形若函数参数中没有CDC参数,则要自己创建CDC对象或指针,并用this对其初始化CClientDC dc(this); dc.TextOut(20, 20, “输出文字");若不是在函数所属的类所对应的窗口输出,则应先获得输出窗口的DC,再进行输出例:在ID为IDC_BUTTON1的按钮的左上角输出“按钮”CButton * pBtn; pBtn =(CButton *)GetDlgItem(IDC_BUTTON1); CDC *pDC=pBtn->GetDC();pDC->TextOut(0,0,"按钮"); ReleaseDC(pDC);视图类的OnDraw 函数当窗口有任何变化时会产生WM_PAINT消息,它的消息处理函数是OnPaintOnPaint会调用OnDraw函数在窗口中画图的代码一般都放在OnDraw函数中(一般不要修改OnPaint函数),以保证在窗口发生变化时,仍然可以显示已经画好的图(即重画一遍)为在其他函数中也可以画图,一般在该函数中调用CWnd类的Invalidate函数,迫使WM_PAINT消息产生清除void Invalidate( BOOL bErase = TRUE ); 功能:使客户区无效(因此需要更新)bErase ——更新时是否擦除背景内容CDC类GDI的绘图工具GDI提供了很多绘图工具,称为GDI对象(图形对象)用户申请设备环境绘图时,使用的是默认的绘图工具,若要使用不同的绘图工具绘图,需要重新设置或定义绘图工具绘图工具与设备环境的关系绘图工具也称图形对象,有多种,例如画笔、笔刷、字体等等图形对象决定绘图的效果,DC决定绘图的形状和绘图的位置每种图形对象有一个“当前”对象,“当前”对象影响对DC的输出结果,要想改变某次绘图的效果,应在这次绘图之前改变相应的“当前”图形对象MFC把不同的绘图工具封装到不同的类,它们基类都是CObject的子类CGdiObject,而不是CDCCPen(画笔类)CBrush (笔刷类)CFont(字体类)CBitmap(位图类)绘图int color=RGB(red,green,blue);CPen newPen(PS_SOLID,width,color);CPen *oldPen=pDC->SelectObject(&newPen); CDC绘图CPoint MoveTo( int x, int y ); CPoint MoveTo( POINT point );功能:把当前位置设置为(x、y)或point 处返回:原来位置的坐标获得当前位置CPoint GetCurrentPosition( ) const;画直线BOOL LineTo( int x, int y );BOOL LineTo( POINT point );功能:以当前位置为起点,函数参数位置为终点画一条直线,并把终点作为新的当前位置返回:失败——0,否则为非0画椭圆BOOL Ellipse( int x1, int y1, int x2, int y2 ); BOOL Ellipse( LPCRECT lpRect );功能:画椭圆,参数确定椭圆外接矩形的坐标画矩形BOOL Rectangle( int x1, int y1, int x2, int y2 ); BOOL Rectangle( LPCRECT lpRect );功能:画矩形,参数确定矩形的坐标输出文本virtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount );BOOL TextOut( int x, int y, const CString& str ); x、y ——文本起始点坐标lpszString ——指向文本的字符指针nCount ——文本的字符数str ——存放文本的对象设置、获得文本颜色virtual COLORREF SetTextColor( COLORREF crColor ); 返回:原来的文本色COLORREF GetTextColor( ) const; 返回当前文本色设置、获得背景色virtual COLORREF SetBkColor( COLORREF crColor ); 返回原来的背景色COLORREF GetBkColor( ) const; 返回当前背景色设置、获得背景模式int SetBkMode( int nBkMode ); 返回原来的背景模式nBkMode ——OPAQUE (默认)显示背景TRANSPARENT :背景透明int GetBkMode( ) const;画折线图int k; CPoint Origin(100,500); // 设置坐标原点for(k=0;k<=600;k+=20){ // 画垂直坐标线pDC->MoveTo(Origin.x+k,Origin.y); pDC->LineTo(Origin.x+k,Origin.y - 400); }for(k=0;k<=400;k+=20){ // 画水平坐标线pDC->MoveTo(Origin.x,Origin.y-k); pDC->LineTo(Origin.x+600,Origin.y - k) } CPoint Point(Origin.x,Origin.y - pnbuf[0]); // 1月数据为起点pDC->MoveTo(Point);CPen pen(PS_SOLID,2,RGB(255,0,0)); pDC->SelectObject(&pen);for(k=1;k<12;k++){Point.x+=50;Point.y=Origin.y - pnbuf[k];pDC->LineTo(Point); // 到下一月数据点画线pDC->Ellipse( Point.x-3 , Point.y-3, Point.x+3 , Point.y+3 ); // 在数据点画个小圆修改字体:CFont cf; cf.CreateFontIndirect(&longf); //按参数创建新字体CDC *pDC=m_Show.GetDC();pDC->SelectObject(&cf); //在设备环境中使用字体pDC->TextOut(50,10,"在控件上输出文字"); ReleaseDC(pDC);在OnInitDialog函数中添加代码:CFont *cf= this->GetFont(); //获得本对话框的默认字体if ( cf ){ cf->GetLogFont(&m_longf); } // 默认字体信息存入m_longfm_FontSize=abs(m_longf.lfHeight) ; //设置并显示默认字号UpdateData(false);组合框消息处理函数添加代码:// UpdateData();int nIndex=m_FontName.GetCurSel(); //获得选中项的索引CString strFont;m_FontName.GetLBText(nIndex,strFont); //获得该索引项的文字内容strcpy(m_longf.lfFaceName,strFont); //以选中的文字设置字体MySetFont(m_longf);通用对话框颜色对话框CColorDialog类字体对话框CFontDialog类文件对话框CFileDialog类文件对话框:void CAView::OnLButtonDown(UINT nFlags, CPoint point){CClientDC dc(this);CString FilePathName; // 存放文件名和路径CFileDialog dlg(TRUE);if(dlg.DoModal()==IDOK)FilePathName=dlg.GetPathName();dc.TextOut(20,20,FilePathName);文件:打开已有文件和新建文件都要创建一个文件对象(CFile 类对象)使用CFile 类的构造函数 使用CFile 类的Open 函数对文件进行操作要使用CFile 类的成员函数 Read 、Write 函数按字节长度读写 写字符串时无法与后面的数据区分 读字符串时需指定读入的长度⏹ 写字符串 读字符串 int n;int n;CString cstr(“test”); CString cstr;char ch[80];n=cstr.GetLength(); file.Read(&n, sizeof(n)); file.Write(&n, sizeof(n));file.Read(ch, n); file.Write(cstr, n);ch[n]='\0'; cstr=ch;文件指针 void SeekToBegin( ) // 定位到文件头 DWORD SeekToEnd( ) //定位到文件尾,返回文件长度获得文件相关信息virtual DWORD GetLength( ) const 返回文件长度 virtual CString GetFileName( ) const 返回文件名 virtual DWORD GetPosition( ) const 返回文件指针位置 MFC 把缓冲区中数据强制写入文件virtual void Flush( )MFC 异常类CException 类 CObject 类的派生类CException 类的子类(派生出的类) CFileException 类 提供文件输入输出时的异常状态CArchiveException 类提供串行化的异常状态⏹ 异常处理程序分为2部分⏹ try 语句块 ⏹ catch 语句块⏹ 用throw 语句“抛出”异常⏹ throw 表达式⏹ 抛出异常的语句放在try 块里⏹ 产生异常后的过程⏹ 跳出try 块,用throw 后面表达式的类型依次与catch 中的类型比较 ⏹ 执行类型匹配的catch 块⏹ 若没有匹配的catch 块,则向上层调用函数传递异常,直到遇到匹配的catch 块⏹ 若程序中没有匹配的catch 块,则程序终止try{可能出现异常的语句块 }catch(异常类型声明1) {异常处理语句块1 }catch(异常类型声明2) {异常处理语句块2 } …catch(异常类型声明n) {异常处理语句块n }void CEx8_1Doc::OnFileSave () {char *pFileName="test.dat";CFile file(pFileName,CFile::modeCreate | CFile::modeWrite); try{ file.Write(&m_pos,sizeof(m_pos)); // 写坐标数据个数file.Write(m_mousePoint,sizeof(m_mousePoint));file.Close();void CEx8_1Doc::OnFileOpen(){ char *pFileName="test.dat";CFile file(pFileName,CFile::modeRead);try{file.Read(&m_pos,sizeof(m_pos));file.Read(m_mousePoint,sizeof(m_mousePoint));file.Close();}catch(CFileException *e){CString estr;estr.Format("错误原因:%d",e->m_cause);AfxMessageBox(estr);file.Abort(); e->Delete();}。
Windows程序设计 第3章 对话框和常见控件
树形控件
树形控件(TreeCtrl)和下面要讲的列表控件(ListCtrl) 在系统中大量被使用,例如Windows资源管理器就是一 个典型的树形控件例子。 树形控件可以用于树形的结构,其中有一个根接点(Root) (Root) 然后下面有许多子结点,而每个子结点上有允许有一个 或多个或没有子结点。MFC中使用CTreeCtrl类来封装树 形控件的各种操作。通过调用 BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
滚动条控件
滚动条(Scroll Bar)一般不会单独使用,因为SpinCtrl 可以取代滚动条的一部分作用,但是如果我们需要自己生 成派生窗口,滚动条还是会派上一些用场。创建一个滚动 条可以使用成员函数: : BOOL CEdit::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
MFC 提供类CDialog作为对话框服务的基类,类CDialog将对话框模板与使 用对话框时必需熟悉的几种类方法进行封装。对于对话框中发送消息的的 控件,我们可创建相应的消息处理程序。MFC编译器提供的框架工具使得 我们把对话框中的控件消息映像到派生类的类函数变得简单、快捷。对话 框数据映像函数使用专门的值初始化对话框中的控件,接着检索数据并使 之有效。大多数对话框需要类成员变量来跟踪用户的输入,这些数据在数 据映像中使用,它们在对话控件与类变量之间自动映像数据。 为创建对话框,首先建立CDialog对象,然后创建和显示对话框窗口我们 有两种选择:一种方法是调用函数CDialog::DoModal()来创建有模式对话 框窗口,另一种方法是调用函数CDialog::Create()来创建无模式对话框窗口, 在上述两种情况之下,对话框对象先初始化,然后创建对话框以及它的控 件。 类CDialog成员函数Create()使用两种重载原形,最常用的一种如下: Create(UINT nIDTemplate, CWnd * pParentWnd=NULL); 其中,参数nIDTemplate是一个对话框模板的标识符, 参数pParentWnd是对话框所属的父窗口。
WINDOWS 程序设计教程(3章)
WINDEF.H头文件
• • • • • • #define CALLBACK #define WINAPI #define WINAPIV #define APIENTRY #define APIPRIVATE #define PASCAL __stdcall __stdcall __cdecl WINAPI __stdcall __stdcall
消息循环以GetMessage()调用开始,它请求Windows从
消息队列中取出一个消息来填充消息结构体的各个字段。 第二、第三和第四个参数设定为NULL或者0,表示程序希 望接收它自己建立的所有窗口的所有消息。 TranslateMessage () 将msg结构体传给Windows,进行一
些键盘转换。
第 3 章 开发Windows应用程序的 技术基础
• 本章主要目:掌握编写Windows应用程序所 采用的基本技术, 约定和惯例,API的结构 与基本用法等作了介绍,对Windows应用 程序的各个组成部分也作了初步介绍,并用 框图的形式介绍Windows应用程序的工作 原理
3.1 应用程序的结构与编译
• Windows应用程序编译图示
.CPP
模块 定义 文件
资源可分成正文资 源(ASCII码格式)、二 进制资源 正文资源:菜单模板、 字符串模板、加速键模板、 对话框模板产生的资源。 二进制资源:图标、 游标、字体等。
头文件(.H)
• WINDOWS.H头文件 • WINDEF.H头文件
– – – – – – – – typedef unsigned long typedef int typedef unsigned char typedef unsigned short typedef float typedef int typedef unsigned int typedef WORD DWORD; BOOL; BYTE; WORD; FLOAT; INT; UINT; ATOM;
C语言Windows程序设计_第三天_属于自己的窗口
C语言Windows程序设计->第三天->属于自己的窗口创建属于自己的窗口==================·创建窗口前的准备在创建窗口前我们先来熟悉几个名词, 这些名词现在可以暂时不去透彻的进行理解, 只需要印象中知道有这么回事就行。
1>. 窗口"窗口"这个我们都已经十分熟悉了, 在Windows中, 一个应用程序窗口上一般会在标题栏上显示程序的名称, 紧挨着标题栏的菜单栏, 或许还会有状态栏、滚动条等其他"装饰品"。
2>. 控件在一些应用程序中, 我们经常可以在程序的界面上(窗口)看到一些按钮(Push Button)、文本框(Text Box)、列表框(List Box)、滚动条(Scroll Bar)等, 这些对象通常被称为控件, 在《Windows程序设计》一书中, 还被称为"子窗口"、"控件窗口"或"子窗口控件"。
3>. 窗口类在建立一个窗口前, 我们必须首先注册一个"窗口类"(Windows Class), 接触过面向对象的朋友应该会首先想到面向对象当中的"类", 但是, 这里"窗口类"中的"类"并不是指面向对象当中的那个"类"。
在这里我们可以把"窗口类"理解为一个结构体, 结构体的成员就是窗口的一些属性, 例如窗口的标题是什么、窗口使用什么样的小图标以及窗口的风格之类的属性, 一个窗口就是一个结构体的对象, 结构体成员的属性决定着窗口的属性。
4>. 消息循环在Windows程序设计中, 消息循环是个不得不提的概念, Windows操作系统是以消息驱动的, 消息队列是指在一个应用程序运行时, Windows操作系统会为该应用程序建立一个"消息队列", 这个消息队列用来存放该程序可能创建的各种窗口的消息, 当用户对应用程序进行操作时, 例如点击一个按钮、调整下窗口的大小等, 此时Windows会立即把这一消息告诉应用程序, 使应用程序能作出相应的动作。
c windows程序设计教程
c windows程序设计教程C语言是一种通用的编程语言,广泛应用于Windows操作系统的程序开发。
在C语言中,可以通过Windows API来使用Windows操作系统提供的功能和服务。
本文将介绍C语言在Windows程序设计中的基本知识和常用技巧。
首先,我们需要了解Windows API的使用方法。
Windows API是一组函数和数据结构的集合,可以通过函数调用的方式来调用Windows操作系统提供的功能。
在C语言中,可以通过在代码中包含Windows头文件(例如windows.h)来使用Windows API。
通过调用不同的API函数,我们可以实现窗口创建、消息处理、用户界面设计等功能。
接下来,让我们来了解Windows窗口的创建和消息处理。
在Windows程序中,窗口是用户界面的基本元素。
我们可以使用CreateWindow函数来创建窗口,并指定窗口的属性,例如窗口类名、窗口标题、窗口大小等。
创建窗口后,我们需要使用消息循环来处理窗口的消息。
消息循环是一个无限循环,用于接收和处理窗口的各种消息,例如鼠标点击、键盘输入等。
在消息处理过程中,我们可以根据接收到的消息类型执行相应的操作,例如更新窗口内容、响应用户的操作等。
此外,Windows程序中常常需要使用各种控件来实现用户界面。
Windows API提供了一些常用的控件,例如按钮、文本框、列表框等。
我们可以使用CreateWindowEx函数来创建这些控件,并设置其属性,例如位置、大小、样式等。
创建完控件后,我们可以使用消息处理函数中的相应处理方式来处理控件的消息。
例如,点击按钮后,可以在消息处理函数中执行相应的操作,例如弹出消息框、更新窗口内容等。
另外,对于一些需要在窗口中绘制图形的应用程序,我们可以使用GDI(图形设备接口)来实现。
GDI提供了一组函数和数据结构,用于实现在窗口中绘制图形、文本等。
通过调用GDI函数,我们可以在窗口的设备上下文中进行绘制操作,例如绘制线条、填充矩形等。
MFCWindows应用程序设计复习题
MFC Windows应用程序设计【复习】第1章Windows应用程序基础知识1. Windows 程序设计是一种( C ) 的程序设计模式。
A:结构化B:面向对象C:事件驱动方式D:XP2. 用户从所有可能的操作中任意选择,被选择的操作会产生某些特定的( ) ,这些事件发生后的结果是向程序中的某些对象发出( ),然后这些对象调用相应的( C )来完成特定的操作。
A:消息,事件,程序B:消息,命令,消息处理函数C:事件,消息,消息处理函数D:事件,消息,程序3. 消息的组成(C)A:消息名称(UINT)B:消息名称(UINT)和参数(PARAM)C:消息名称(UINT)和两个参数(WPARAM,LPARAM)D:消息名称(UINT)和两个参数(HPARAM,LPARAM)4. 程序在( B) 对消息进行分析A:入口函数(WINMAIN)中B:在窗口过程函数(WNDPROC)中C:收到消息时D:消息发生时5. 一个消息( B )A:可以不被窗口接受B:必须由一个窗口接收C:可以由一个或多个窗口接收D:必须由多个窗口接收6. 当没有为某消息编写消息处理时( C )A:不进行处理B:程序出错C:默认的窗口过程进行处理D:无法发出此消息7. 应用程序接收到( A )消息时停止接收其他消息A:WM_QUIT B:WM_DESTORYC:WM_PAINT D:WM_COMMAND8. 下列Windows数据格式中,代表设备句柄的是(B)。
A. HWNDB. HDCC. HINSTANCED. HFONT9. 典型的Windows窗口程序的流程为:(A)A. 注册窗口类->创建窗口->显示窗口->更新窗口->消息循环B. 创建窗口->注册窗口类->显示窗口->更新窗口->消息循环C. 创建窗口->注册窗口类->显示窗口->更新窗口->消息循环D. 注册窗口类->创建窗口->更新窗口->显示窗口->消息循环10. 在WinMain函数的原型中HINSTANCE hInstance 定义的是(A)HINSTANCE hPrevInstance定义的是(B)LPSTR lpCmdLine定义的是(C)int nCmdshow)定义的是(D)A:当前实例句柄B:先前实例句柄C:指向命令行参数的指针D:窗口的显示状态11. 以下哪个不是WinMain函数中完成的操作(D)A:注册窗口类B:创建应用程序主窗口C:进入应用程序消息循环D:调用窗口过程函数12. 下面说法错误的是(D)A:一个Windows程序可以包含多个窗口过程B:一个窗口过程总是与调用RegisterClass注册的特定窗口类相关联C:CreateWindow函数根据特定窗口类创建一个窗口,但基于一个窗口类,可以创建多个窗口D:窗口过程必须由程序调用,而不是由Windows本身直接调用13. Windows应用程序中使用了各种Windows API函数声明,宏定义,数据类型定义,(D)是主要的包含文件。
windows程序设计3
CMyClass :: CMyClass ( int x ) { member = x ; }
CMyClass :: CMyClass ( CMyClass& c ) { member = c . member ; }
注意:一是拷贝初始化构造函数必须使用引用参数;
二是以值调用方式向一个函数传递参数时,拷 贝初始化函数也被调用。 例: void fun ( CMyClass a ) ; int main ( ) { CMyClass my( 5 ) ; fun ( my ) ; // … … }
CPen zhang ;
通过对象可以访问类中的公有类型数据和成员函 数,其使用方式为: 对象名 . 成员函数名
对象名 . 数据成员
例:zhang . age = 20;
zhang . PrintAge( );
= “zhang lei “; //error
通过指向类类型对象的指针访问类的公有数据成 员和成员函数时,其使用方式为:
1. 问题的提出 欲在几个函数之间实现数据共享,比较可取的方法有 两种: 一是将数据存储在局部变量中,通过参数传递机制在 各个函数之间共享; 二是将这些函数和数据封装在一个类中,通过建立该 类的对象,使这些函数操作该类的数据成员达到共享的 目的。 第二种方法应作为首选,其次考虑参数传递,最后还 可以考虑使用全局对象。
Windows程序设计
2000.9
第三章 类与对象
本章主要内容:
类和对象的定义 类的成员 构造函数与析构函数;内联成员函数;静态 数据成员和成员函数 this指针,const关键字 友元函数 引用
3.1 类的定义
类是对一组客观对象的抽象,它将该组对象所具有的 共同特征(包括结构特征和行为特征)集中起来,以说明 该组对象的能力和性质。 类(class)是一种用户自定义的数据类型。 class 类名称
第3章 Swing图形界面(1)
//定义用户关闭框架时的响应动作,这里只是简单退出
frame.show(); //使窗口可见 }
} //定义一个JFrame子类 class SimpleFrame extends JFrame { public static final int WIDTH = 300; public static final int HEIGHT = 200; public SimpleFrame() { setSize(WIDTH, HEIGHT); } //设置框架的尺寸 }
在构造方法中调用该方法用来初始化窗体
添加组件 设置位置坐标,以像素为单位 设置大小,以像素为单位 设置是否可视,当参数是true则可视,当是false则隐藏 设置容器面板 设置窗体左上角的图标 设置窗体缺省的关闭操作,参数是常量,例如:EXIT_ON_CLOSE 设置标题
-12-
• JFrame: 在Java中,包括边框、标题以及最小化和关闭窗 口的按钮装饰的顶层Swing容器。 • JFrame的内部结构
-10-
•
窗口(JWindow)、窗体(JFrame)、和对话框(JDialog)的属性
属性
模态
可调整大小 标题栏 边框 标题
窗口(JWindow) 窗体(JFrame)
否
否 否 否 否
对话框 (JDialog)
否/CSG
是/SG 是 是 是/CSG
否
是/SG 是 是 是/CSG
菜单栏
焦点管理器 警告字符串 图标图像 连接到一个窗体 1.是/否指缺省的属性状态
注意:在AWT中,可以调用add方法把组件直接添加到一个AWT Frame 中。在Swing中,这是不可能的。你必须把组件添加到内容窗格中。
PB_03第3章 窗口
3.3.1 PowerBuidler窗口函数
3. 触发事件 触发事件 objectname.TriggerEvent ( event {, word, long } ) objectname:对象名称; event:要触发的事件; word和long: 传递的事件参 数 TRUE:成功 FALSE:失败 触发事件(放入事件队列) objectname.PostEvent ( event, { word, long } ) objectname:对象名称; event:要触发的事件;word和long: 传递的事件参数 TRUE:成功 FALSE:失败 传递参数的具体要求: (1) 传递参数只能是字符串、数值或PowerBuilder对象; (2) 传递参数存储在Message对象的相应属性中,即在Message.StringParm 中 , 数 值 在 Message.DoubleParm 中 , PowerBuilder 对 象 在 Message.PowerObjectParm中; (3) 要 返 回 多 个 值 , 应 创 建 存 放 传 递 参 数 的 用 户 自 定 义 结 构 , 访 问 Message对象的PowerObjectParm属性。 (4) 传递事件参数为word或long数据类型,传递参数存储在Message对象 的相应属性中,即WordParm和LongParm中。如果Long参数值为字符串, 可在被触发的事件中,使用String函数,并用address关键字指定参数的格 式。
窗口 的其 它属 性页 见图。
3.2.4 窗口的其它属性页
窗口的其它属性页包含了两个功能: 一个是调整窗口的位置和几何尺寸; 另一个是选择在窗口内的光标形状。 调整窗口的几何尺寸有两种方法: 一种是在窗口画板的布局视图区中用鼠标来实现,将鼠标移动到 布局视图区中窗口的外边沿处,使鼠标指针变为双向箭头,然后 按下鼠标左键并拖动鼠标来改变窗口的大小。窗口尺寸改变较大 时,需要借助布局视图区的水平或垂直滚动条来完成。 另一种调整窗口的几何尺寸的方法就是在本属性页中修改窗口的 尺寸,所有尺寸均采用PBU 的单位units。
Windows程序设计基础
2.
4.2.3 CheckBox(复选框)
该控件用于同时选择多个选项的情况。 【例4.3 】CheckBox控件应用
1.
通过对属性Checked值的判断确定复选框是否处于选 中状态。 true表示选中,false表示未选中。
2.
4.2.3 CheckBox(复选框)
if (checkBox1.Checked == true && checkBox2.Checked == true) textBox3.Text = "我喜欢" + checkBox1.Text + "和" + checkBox2.Text; else if (checkBox1.Checked == true && checkBox2.Checked == false) textBox3.Text = "我喜欢" + checkBox1.Text; else if (checkBox1.Checked == false && checkBox2.Checked == true) textBox3.Text = "我喜欢" + checkBox2.Text; else if (checkBox1.Checked == false && checkBox2.Checked == false) textBox3.Text = "";
1. 2. 3. 4.
Large Icons(大图标) ( ) Small Icons(小图标) ( ) List(列表) Details(报告) ( )
4.3.4 TreeView(树形视图)
Windows程序设计-第01章-Windows程序设计简介
本章主要从Windows发展史、开发工具、开发框架的组成以及应用范围四个方面讲述。其中,Windows发展史,主要讲述了从DOS操作系统发展到Windows操作系统的历史过程,重点讲述了Windows操作系统的几个发展时期;开发工具,主要简述了开发工具的基本应用,以及工程的创建方法;应用程序开发框架组成部分,简述了Win32应用程序的开发框架,即项目文件的组成。
Windows98 SE(第二版)发行于1999年6月10日。它包括了一系列的改进,例如Internet Explorer 5、WindowsNetmeeting 3、Internet Connection Sharing、对DVD-ROM和对USB的支持。
Windows98被人批评为没有足够的革新。即使这样,它仍然是一个成功的产品。第二版也被批评不能在第一版的基础上自由升级。
图1.4
1994年,Windows3.2中文版本发布,国内有很多Windows的先驱用户就是从这个版本开始接触Windows系统的。由于消除了语言障碍,降低了学习门槛,因此Windows3.2在国内很快流行起来。
图1.5
1995年8月24日Windows95发布,这个操作系统开创了Windows的新纪元。新的操作系统发生了质的变化,具有全新的界面和强大的功能,这在某种程度上也宣告了DOS时代的结束。Windows95的销售量在短短4天内就超过了一百万份,出色的多媒体特性、人性化的操作、美观的界面使Windows95获得空前成功。业界也将Windows95的推出看作是微软发展的一个重要里程碑。
图1.1
1981年Xerox(施乐)公司开发了第一个商用图形操作系统。1983年苹果公司开发了第一个基于图形界面的操作系统。1985年微软公司推出了自己的Windows操作系统,即为Windows1.0版本,最初售价为100美元。Windows1.0是微软第一次对个人电脑操作平台,进行了用户图形界面的尝试。Windows1.0从本质上宣告了MS-DOS操作系统的终结。由于Windows1.0仅仅是由字符堆砌,界面非常简陋,所以后来有人将其评价为最不成功的作品。
第三章初步使用与基本配置
第三章初步使用与基本配置3.1使用基础一、登录与关机安装好Linux后,如果你已经配置了Xserver,使用图形界面启动,启动时是X视窗的登录画面,你可以在X视窗下象使用Windows那样做各种操作,如文字处理、图形图象处理、上网、玩游戏等。
但是如果你安装了Linux后,在进行X Window System设置时,取消了用图形界面启动(即取消Use Graphic Login选项),或Xfree86不支持你的显卡,那么Linux是用文字方式启动,启动后会出现要求输入登录名的画面Login:要求你输入用户名及密码,我们可以输入 root及安装时设置的密码,或者是安装过程中新增的用户。
关机的方法:1.在字符界面下输入命令:reboot或shutdown –r now 重新启动。
shutdown –h now 关机。
2.以root身份在GNOME主菜单,选择Logout,然后选Reboot或是Halt.3. 按Ctrl+Alt+Del强制重新启动。
4.用命令将系统切换到运行级别0(停机)或运行级别6(重启动)。
例:init 0 关闭系统init 6 重新启动系统二、用户界面用户界面是指用户与计算机交流的方式,一般,Linux操作系统提供了几种不同的用户界面:主要分为基于文本方式的命令行界面与图形桌面环境的X Window 两种。
1.命令行界面命令行界面是Linux系统下最直观、功能最强的用户界面,安装系统后,第一次进入Linux环境时,系统将自动启动相应的shell,shell是一种命令行解释程序,负责用户和操作系统之间的沟通,在提示符下输入的每个命令都是由shell 解释后传给Linux内核执行的。
通过shell我们可以启动、挂起、停止甚至编写程序。
Shell的种类很多,红旗Linux使用的shell是Bash。
Bash是Bourne Again Shell的缩写,在Bash下,root用户用“#”作提示符,普通用户用“$”作提示符。
深入浅出 windows api 程序设计
深入浅出windows api 程序设计全文共四篇示例,供读者参考第一篇示例:深入浅出Windows API程序设计Windows API是Windows操作系统所提供的一组接口,允许开发者与操作系统进行交互,控制、管理和定制系统资源。
通过调用Windows API,开发者可以实现各种功能,包括但不限于文件操作、窗口管理、内存管理、网络通信等等。
深入掌握Windows API程序设计,可以让开发者更加灵活地处理系统资源,提高程序性能和用户体验。
本文将通过实例介绍Windows API程序设计的基本原理和常用技巧,帮助读者快速上手和深入了解Windows API。
Windows API是一组由微软公司定义和支持的应用程序编程接口,包括了一系列的函数、结构体和常量。
开发者可以通过调用这些接口,实现对操作系统资源的操作和控制。
Windows API可以分为用户界面API和系统服务API两类。
用户界面API包括了一系列函数,用于创建、管理和处理用户界面元素,如窗口、按钮、菜单等。
其中最常用的函数包括CreateWindow、SendMessage、GetDlgItem、SetWindowText 等。
系统服务API则包括了一系列函数,用于访问系统资源和执行系统级操作,如文件操作、注册表访问、进程管理等。
常用的系统服务API函数包括CreateFile、RegOpenKey、EnumProcesses等。
Windows API程序设计的基本原理是通过调用API函数,与操作系统进行交互并控制系统资源。
在使用Windows API进行程序设计时,需要注意以下几点:1. 导入API函数:在使用Windows API时,需要先导入对应的API函数。
可以通过声明函数原型的方式告诉编译器需要调用的函数及其参数,然后利用LoadLibrary和GetProcAddress函数来获取函数的地址。
2. 创建消息循环:在Windows程序中,消息循环是至关重要的部分。
MFCWindows应用程序设计(第3版)任哲18章汇总
物理内存空间
页表指针
进程空间
图10-20 进程空间形成了进程之间的安全边界
程序1的进程控制块 程序1代码 页表 程序域
物理空间
进程空间
程序2的进程控制块
程序域1 程序域2 程序2代码
程序域
图10-21 程序域的概念
图10-22 例10-5程序运行结果
人有了知识,就会具备各种分析能力, 明辨是非的能力。 所以我们要勤恳读书,广泛阅读, 古人说“书中自有黄金屋。 ”通过阅读科技书籍,我们能丰富知识, 培养逻辑思维能力; 通过阅读文学作品,我们能提高文学鉴赏水平, 培养文学情趣; 通过阅读报刊,我们能增长见识,扩大自己的知识面。 有许多书籍还能培养我们的道德情操, 给我们巨大的精神力量, 鼓舞我们前进。
源程序
编译器
编译器
编译器
可执行程序
可执行程序
可执行程序
统一界面
软件层
Linux SPARC
软件层
Windows x86 图18-3 实现跨平台的思想
软件层
OS/2 MIPS
Oak语言源程序
编译
可装配的字节码程序
其他可装配的字节码程序
装配/连接
运行时装配连接 字节码程序(可执行程序)
字节码解释器 虚拟机 字节码指令执行器 本地机器操作系统 现有机器硬件
图18-18 程序运行结果
图18-19 程序运行结果
图18-20 MFC的事件处理机制
图18-21 使用委托的事件处理方法
图18-22 程序运行结果
图18-23 创建CLR/Windows窗体应用程序工程
图18-24窗体应用程序用户界面设计窗口
填写鼠标 单击事件 处理代码 处
Windows程序设计课程设计指导书
重庆科技学院Windows程序设计课程设计指导书目录第一章概述 (2)第二章安全知识网络认证证书填报程序开发 (3)第三章读取Excel数据表数据程序开发 (4)第四章CListView数据导入Excel数据表 (5)第五章屏幕广播程序设计开发 (6)第六章搜索试卷Word文档关键字生成答题卡 (7)第七章文件下发与接收程序设计 (8)第八章同学信息管理程序设计 (9)第九章向Word文档添加表格贯入CListView数据 (10)第十章课程序设计任务书 (11)第十一章课程设计书撰写要求 (19)11.1格式要求 (19)11.1.1页面设置 (19)11.1.2字体与间距 (19)11.1.3序号 (19)11.1.4表格 (19)11.1.5插图 (20)11.1.6公式 (20)11.1.7软件 (20)11.1.8摘要与关键词 (20)11.1.9参考文献 (22)11.1.10 目录 (22)11.2装订要求 (24)11.2.1装订顺序 (24)第一章概述在学习了Windows程序设计后进行课程设计,目的是让学生梳理Windows程序设计的基本方法和技术,应用Windows操作系统提供的功能设计开发实际课题。
本次课程设计课题是针对教学过程中讲授的内容确定的,主要内容包括:(1)窗口控制过程;(2)设备描述表(CDC)与位图、Jpeg有损压缩;(3)应用程序文档数据导入Excel数据,Excel数据表数据导入到应用程序文档;(4)应用程序文档数据导入Word表格,以及在Word文档中搜索关键字、定位提取数据;(5)使用ADO访问SQL Server数据库;(6)动态链接库(DLL);(7)网络数据通讯;(8)线程与数据同步。
不同课题需要使用不同的方法进行设计开发,让同学在实际设计开发过程了解、掌握Windows系统下应用程序的开发技术,通过课程设计使用同学脑海中打下深深有烙印,沉淀Windows程序设计的知识与技术为今后实际课题开发打下基础。
windows程序设计3
LONG InterlockedIncrement(LONG volatile* Addend); //递 增指定的32位变量 LONG InterlockedDecrement(LONG volatile* Addend); //递 减指定的32位变量 这两个函数可以阻止其他线程同时访问此变量。
Signaled指示了线程对象是否为受信状态。运行期间FALSE, 即未受信,线程结束后,系统把其置为TRUE,针对此对象的 等待函数(如WaitForSingleObject)就会返回。
•线程的终止
•线程正常终止时,会发生以下事件: •在线程函数中创建的所有C++对象将通过它 们各自的析构函数被正确的销毁。 •该线程使用的堆栈被释放。 •系统将线程内核对象中ExitCode的值由 STILL_ACTIVE设置为线程函数返回的值。 •系统将递减线程内核对象中Usage Code的 值。
•2 互锁函数
互锁函数为同步访问多线程共享变量提供了一 个简单的机制。如果变量在共享内存,不同进程的 线程也可以使用此机制。 用于互锁的函数有InterlockedIncrement、 InterlockedDecrement、InterlockedExchangeAdd、 InterlockExchangePointer等。
void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
当操作完成时,还要将临界区还给 Windows,以便其他线程可以申请使用。
void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
Ch19.Windows窗体应用程序-C#程序设计教程(第3版)-微课版-江红-清华大学出版社
• CheckedListBox(复选列表框)控件与ListBox 控件类似,用于显示项的列表,同时还可以在 列表中的项的旁边显示选中标记
• 【例19.4】ComboBox、ListBox、 CheckedListBox应用示例(Computer)
• 由于Windows窗体应用程序涉及复杂的用户界 面和事件处理过程,故一般通过集成开发环境 Visual Studio开发和调试Windows窗体应用程序
表19-1 窗体和大部分控件常用的事件
19.1.2 创建Windows窗体应用程序
• 使用Visual Studio集成开发环境,可以快 速高效地开发Windows窗体应用程序。
• 双击窗体中的“复制”按钮控件,系统将自动生 成button1_Click事件处理程序,在其中加入语句 ,以将源文本框选中的内容复制到目标文本框中 ,同时更改源文本框中所选文本的字体样式和颜 色
• (4)运行并测试应用程序
• 解决方案 • 应用程序
单选按钮、复选框和分组
• RadioButton(单选按钮)控件用 于选择同一组单选按钮中的一个 单选按钮(不能同时选定多个)
【例19.4】ComboBox、ListBox、 CheckedListBox应用(1)
• (1)创建Windows应用程序 • (2)窗体设计
【例19.4】ComboBox、ListBox、 CheckedListBox应用(2)
• (3)创建处理控件事件的方法
– 显示用户所选择的电脑配置信息
• (1)创建Windows应用程序 • (2)窗体设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ห้องสมุดไป่ตู้译应用程序所需的六个基本文件
什么资源文件与资源描述文件(.RC)?在编译中的 作用? 模块定义文件(.DEF)的结构(请见教材程序\3\模 块定义文件.doc)和在编译中的作用? 头文件(.H)的作用? WINDOWS.H头文件 (请见教材程序 \3\WINDOWS.H头文件.doc). WINDEF.H头文件(请见教材程序\3\WINDEF.头 文件.doc). 项目文件(.MAKE)在编译中的作用?
第 3 章 开发Windows应用程序的 技术基础
本章主要目的是向读者介绍编写Windows 应用程序所采用的基本技术, 约定和惯例, API的结构与基本用法等作了介绍,对 Windows应用程序的各个组成部分也作了 初步介绍,并用框图的形式介绍Windows应 用程序的工作原理
3.1 应用程序的结构与编译
�
练习 3
1. 16位和 32位Windows 操作系统对应用程序的支持有什么不同 操作系统对应用程序的支持有什么不同? 位和 位 2. Windows应用程序的编译和 语言程序编译有什么不同 应用程序的编译和C语言程序编译有什么不同 应用程序的编译和 语言程序编译有什么不同? 3. 资源描述文件的作用是什么?资源编译器的功能是什么? 4. 资源文件与资源描述文件 资源文件与资源描述文件(.RC)的区别? 的区别? 的区别 5. 模块定义文件 模块定义文件(.DEF)在编译中的作用? 在编译中的作用? 在编译中的作用 6. WINDOWS.H头文件的作用?WINDEF.H中定义了那些东西?WINNT.H头文件的作 用? 7.项目文件的作用? 8. 简述程序设计接口 程序设计接口(API)的组成情况 程序设计接口 的组成情况 9. 讲讲匈牙利命名惯例的约定,还要记住那些习惯用法? 匈牙利命名惯例的约定, 匈牙利命名惯例的约定 还要记住那些习惯用法? 10. 解释事件驱动程序的原理,并和过程式程序进行比较 11. 何谓动态连接?何谓静态连接?动态连接库文件的后缀是什么? 12. Win32里,微软设计者们又定义了一种新的调用规范,用什么符号表示? 13. 介绍PASCAL调用规范,C调用规范(用_cdecl表示),_stdcall调用规范 14. W32中有那些识别字都定义成_stdcall 15. 消息循环从应用程序消息队列取得窗口消息是怎样送给窗口消息处理程序 消息循环从应用程序消息队列取得窗口消息是怎样送给窗口消息处理程序?
3.5 动态链结和动态链结库
静态连接和动态连接的基本概念. 如何进行链结. 如何建立DLL文件请见其他有关文章和书籍.
3.6 PASCAL与WINAPI调用规范
什么是C调用规范. Win 16中的PASCAL调用规范 调用规范(_cdecl ). 调用规范 . Win 32中的PASCAL调用规范 调用规范(_stdcall ). 调用规范 Win32中的 中的WINAPI调用规范 调用规范(_stdcall ) . 中的 调用规范 比较C,_cdecl ,_stdcall 三种调用规范. 调用规范的同义词(请见教材程序\3\调用规 范的同义词.doc).
3.7 Windows应用程序的工作原理 应用程序的工作原理
句柄与代号 . 单一应用程序情况下输入消息的获得与处 请见教材程序 理(请见教材程序 单一应用程序情 请见教材程序\3\单一应用程序情 况.doc) . 消息循环程序及其解释(请见教材程序\3\消 息循环.doc). 应用程序的结束(请见教材程序\3\应用程序 的结束.doc). 窗口类的作用及其用法初步
3.1.1 Windows应用程序的结构和C 语言程序结构的比较
Windows Function 图3-1 Windows应用程序的结构有两个函数所组成,一个是WinMain函数,另一个称为窗口函数,又称窗 口消息处理程序. 请见Windows应用程序的结构和 语言程序结构的比较 应用程序的结构和C语言程序结构的比较 应用程序的结构和 C语言程序的主体结构是 Main() { ………… } 定义函数1 定义函数2 . 定义函数n C语言程序的主体结构是主函数Main和一些函数定义所组成. 而Windows应用程序的结构可以用下面的框图来表示. WinMain
3.4 事件驱动程序设计
什么是事件驱动程序设计,它与传统程序 事件驱动程序设计, 事件驱动程序设计 设计有什么区别. 设计有什么区别. 解释图 的工作原理(请见教材程序 事 解释图3-4的工作原理 请见教材程序 的工作原理( 教材程序\3\事 件驱动程序的工作原理.doc). 件驱动程序的工作原理 . 消息与消息处理是实现事件驱动的关键. 消息与消息处理是实现事件驱动的关键.
3.8 窗口类的作用及其用法初步
每个 每个Windows应用程序 或进程 都要有一 应用程序(或进程 应用程序 或进程)都要有一 个窗口,每个窗口代表一个应用程序. 个窗口,每个窗口代表一个应用程序. 窗口类结构与窗口类是不同又有联系的概 念. 应用程序建立窗口的大概过程. 应用程序建立窗口的大概过程.
3.1.2 Windows应用程序的编译和C 语言程序编译的比较
C语言的编译图示 (请见教材程序\3\C语言 语言的编译图示 的编译用图表示如下.doc Windows应用程序编译图示(请见教材程序 \3\Windows应用程序编译系统.doc). Windows应用程序编译系统工作步骤(请 见教材程序\3\编译系统的工作过程.doc).
3.2 Windows 应用程序设计接口 (API)
学习API的重要性. 简要介绍两种API. 每个API主要有哪三个文件(请见教材程序 \3\三个核心API组件.doc). 每个文件的作用.
3.3 标识符的匈牙利命名惯例
为什么此惯例称为匈牙利命名惯例. 匈牙利命名惯例的两条约定. 匈牙利命名惯例的两条约定. 要熟悉很多习惯用法.例如WPARAM和 要熟悉很多习惯用法.例如 和 LPARAM 是习惯用法. 按照匈牙利命名惯例 匈牙利命名惯例常用变量的字首(请见 匈牙利命名惯例 教材程序\3\常用变量的字首.doc
解决多任务的关键是:控制核心应该从程序本身转 移到Windows操作系统.应该由Windows操作系 统决定那个应用程序可以占用CPU时间,程序的 结构也不再是过程式程序中的赋值,循环,分支 等C语言中常见的结构,而是消息,处理.为了 解决这个问题,应用程序采用一种称为"事件驱 动结构"是合适的.所谓非抢占式是指一旦这个 应用程序取得了执行权,就一直要把这个程序执 行下去,除非遇到新的消息来干预.否则,其他 程序没有办法执行.如果把非抢占式和"事件驱 动结构相结合,那就是Win16操作系统下的应用 程序.