精华内容
下载资源
问答
  • Windows窗口程序

    2020-03-09 17:59:25
    什么是窗口 想要深入了解Windows机制就必须从我们随处可见的Window(窗口)说起。窗口就是我们在使用图形...一下图片是窗口的组成部分,各个组成部分都有自己的行为特征。大部分窗口都和以下图片类似,但并不是每个...

    什么是窗口

    想要深入了解Windows机制就必须从我们随处可见的Window(窗口)说起。窗口就是我们在使用图形程序时,屏幕上显示的矩形区域。不同的窗口可能包含一些相同组成部分,如:窗口外沿,就是我们用于拖拽窗口移动位置的外边框。标题栏,也就是窗口程序最上方显示标题的地方,一般用于显示应用程序名字。一下图片是窗口的组成部分,各个组成部分都有自己的行为特征。大部分窗口都和以下图片类似,但并不是每个窗口都有标题栏,状态栏等,举个典型的例子,瑞星杀毒软件的小狮子就是一个窗口。

    窗口的运作方式

    首先窗口程序是由事件驱动的,用户可能随时发出各种消息,如:操作过程中绝得窗口不够大了,马上拖动边框,程序就必须马上调整客户区的内容以适应新窗口大小;用户可能突然想要做其他事情,可能随时会把窗口最小化甚至关闭,窗口程序也必须立即响应缩小和退出的消息请求。如果窗口没有接收特定的请求,它们就会一动不动的停在桌面上什么也不做。

    它与过程驱动方式不同,顺序驱动方式只是单纯的按照代码逻辑一行一行处理数据,当第一遍流程处理完毕后就直接退出程序了,无法再次重头处理一遍,这就是事件驱动和顺序驱动的区别。

    说白了就是窗口程序循环接受用户或者系统其他程序发来的消息持续处理,接收到退出事件才会退出;而顺序驱动的程序只处理一遍代码逻辑直接退出了。

    以下是实现一个窗口的完整过程:

    创建一个或多个窗口回调函数,因为一个Win32程序有可能不止一个窗口,而每个窗口必须有一个回调函数,所以一个win32程序可能有多个窗口回调。

    创建一个WNDCLASSEX窗口对象填写对应窗口的信息,并将窗口类通过RegisterClassEx()函数注册进入Windows消息机制中。注册后需要调用显示创建的窗口调用ShowWindow()和UpdataWindow()函数显示窗口在屏幕上。接下来需要调用user32.dll的GetMessage()函数,从对应程序的消息队列中获取对应程序的消息。然后调用user32.dll中的DispatchMessage()函数将消息分发给正确的处理该消息的窗口即可。

    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ; FirstWindow.asm
    ; 窗口程序的模板代码
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ; 使用 nmake 或下列命令进行编译和链接:
    ; ml /c /coff FirstWindow.asm
    ; Link /subsystem:windows FirstWindow.obj
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    		.386
    		.model flat,stdcall
    		option casemap:none
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ; Include 文件定义
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    include		windows.inc
    include		gdi32.inc
    includelib	gdi32.lib
    include		user32.inc
    includelib	user32.lib
    include		kernel32.inc
    includelib	kernel32.lib
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ; 数据段
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    		.data?
    hInstance	dd		?
    hWinMain	dd		?
    
    		.const
    szClassName	db	'MyClass',0
    szCaptionMain	db	'My first Window !',0
    szText		db	'Win32 Assembly, Simple and powerful !',0
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ; 代码段
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    		.code
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ; 窗口过程
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    _ProcWinMain	proc	uses ebx edi esi hWnd,uMsg,wParam,lParam
    		local	@stPs:PAINTSTRUCT
    		local	@stRect:RECT
    		local	@hDc
    
    		mov	eax,uMsg
    ;********************************************************************
    		.if	eax ==	WM_PAINT
    			invoke	BeginPaint,hWnd,addr @stPs
    			mov	@hDc,eax
    
    			invoke	GetClientRect,hWnd,addr @stRect
    			invoke	DrawText,@hDc,addr szText,-1,\
    				addr @stRect,\
    				DT_SINGLELINE or DT_CENTER or DT_VCENTER
    
    			invoke	EndPaint,hWnd,addr @stPs
    ;********************************************************************
    		.elseif	eax ==	WM_CLOSE
    			invoke	DestroyWindow,hWinMain
    			invoke	PostQuitMessage,NULL
    ;********************************************************************
    		.else
    			invoke	DefWindowProc,hWnd,uMsg,wParam,lParam
    			ret
    		.endif
    ;********************************************************************
    		xor	eax,eax
    		ret
    
    _ProcWinMain	endp
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    _WinMain	proc
    		local	@stWndClass:WNDCLASSEX
    		local	@stMsg:MSG
    
    		invoke	GetModuleHandle,NULL
    		mov	hInstance,eax
    		invoke	RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
    ;********************************************************************
    ; 注册窗口类
    ;********************************************************************
    		invoke	LoadCursor,0,IDC_ARROW
    		mov	@stWndClass.hCursor,eax
    		push	hInstance
    		pop	@stWndClass.hInstance
    		mov	@stWndClass.cbSize,sizeof WNDCLASSEX
    		mov	@stWndClass.style,CS_HREDRAW or CS_VREDRAW
    		mov	@stWndClass.lpfnWndProc,offset _ProcWinMain
    		mov	@stWndClass.hbrBackground,COLOR_WINDOW + 1
    		mov	@stWndClass.lpszClassName,offset szClassName
    		invoke	RegisterClassEx,addr @stWndClass
    ;********************************************************************
    ; 建立并显示窗口
    ;********************************************************************
    		invoke	CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
    			WS_OVERLAPPEDWINDOW,\
    			100,100,600,400,\
    			NULL,NULL,hInstance,NULL
    		mov	hWinMain,eax
    		invoke	ShowWindow,hWinMain,SW_SHOWNORMAL
    		invoke	UpdateWindow,hWinMain
    ;********************************************************************
    ; 消息循环
    ;********************************************************************
    		.while	TRUE
    			invoke	GetMessage,addr @stMsg,NULL,0,0
    			.break	.if eax	== 0
    			invoke	TranslateMessage,addr @stMsg
    			invoke	DispatchMessage,addr @stMsg
    		.endw
    		ret
    
    _WinMain	endp
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    start:
    		call	_WinMain
    		invoke	ExitProcess,NULL
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    		end	start
    

    程序显示结果

    Windows的消息驱动机制

    在这里详细描述完整的Windows消息驱动机制。看下图

    Windows下的窗口程序不止1个,往往有很多程序在同时运行。当用户点击其中一个程序的窗口或者进行其他操作时,Windows系统对应被点击程序就会判断点击的坐标位置是否是当前程序的窗口坐标或者窗口范围内。如果是,则该程序就会产生一个消息结构体,记录下消息产生的原因送入Windows系统的总消息队列里。然后系统再根据产生的消息分配到每个应用程序的消息队列中。(从总的消息队列中再次分类,将消息挨个“落户”到每个程序对应的消息队列中)。当应用程序调用GetMessage()函数时,系统会从调用GetMessage()函数中的应用程序对应消息队列中取出一条消息交给应用程序,得到消息后还需要知道这条消息具体应该交给该应用程下的哪个窗口去处理,这时候就再次调用DespatchMessage()函数,将消息交给对应窗口的消息回调函数,执行该窗口的条件分支来处理这个消息。

    程序之间是允许相互传递消息的,PostMessage()函数允许一个程序将消息发送到其他程序的消息队列中。SendMessage()更加极端,直接将消息交给其他应用程序的具体某个窗口,让该窗口的窗口回调消息直接处理要发送的消息。

    展开全文
  • 此时,你可以用它来滚动窗口,来显示内容不同部分。 滚动条这个东西用电脑应该都见得多了,由两个中间包含三角方块和一个位于两个方块之间长条组成,一般来说这个长条是可以随着显示内容占总内容多少来改变...

    本次要介绍的是窗口滚动条。滚动条一般在要显示的东西过多以至于屏幕无法完整呈现时使用。此时,你可以用它来滚动窗口,来显示内容的不同部分。

    滚动条这个东西用电脑应该都见得多了,由两个中间包含三角的方块和一个位于两个方块之间的长条组成,一般来说这个长条是可以随着显示内容占总内容的多少来改变长度的这个比例越小,长条越小。

    想要在窗口中添加滚动条十分的简单,只需要在CreateWindow函数的第三个参数dwStyle中加入WS_VSCROLLWS_HSCROLL即可,当然你只添加其中一个也可以,H代表水平滚动条,V代表垂直滚动条。需要注意的是显示区域不包括滚动条占据的空间,对于特定的机器,水平滚动条的高度和垂直滚动条的宽度是恒定的,想要获取这些值,你可以用GetSystemMetrics函数来获得。

    滚动条有其范围和位置,范围由一对整数iMin和iMax表示,位置由一个整数iPos来表示。默认情况下nMin为0,nMax为100,当然这些你是可以用SetScrollInfo函数来更改的。

    接下来讲一下用滚动条的一般流程,

    首先你需要在WM_CREATE消息下处理一下基础信息,比如说你要滚动的内容是文字,那么你就需要计算出文字的宽,高以及大写时候的宽,这里需要用到一个结构体是TEXTMETRIC,这个结构体有很多成员,但我只将用到的以代码的形式呈现出来,

    TEXTMETRIC tm;
    GetTextMetrics(hdc, &tm);
    cxChar = tm.tmAveCharWidth;
    cxUpper = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
    cyChar = tm.tmHeight + tm.tmExternalLeading;
    
    cxChar是字符的宽度,cyChar是字符的高度,cxUpper是字符大写后的宽度。为什么大写的字符宽度要这么算,因为对于等宽字体来说,tm.tmPitchAndFamily的最低位是0,cxUpper等于cxChar,对于非等宽字体来说,tm.tmPitchAndFamily的最低位是1,cxUpper应该是cxChar的1.5倍,所以就会有上面的的代码写法。除了一些字符的信息,你还可以计算以信息比如说总共的文字行数等等。。。

    然后你需要在WM_SIZE消息下设置滚动条的信息。这里又要用到另一个结构体,叫SCROLLINFO

    typedef struct tagSCROLLINFO {
      UINT cbSize;
      UINT fMask;
      int  nMin;
      int  nMax;
      UINT nPage;
      int  nPos;
      int  nTrackPos;
    } SCROLLINFO, *LPCSCROLLINFO;
    
    
    cbSize是结构体的大小,sizeof(si);

    fMask指定你要设置或者获取的滚动条信息,

    SIF_ALL SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS
    SIF_DISABLENOSCROLL 只有在设置信息的时候才有用,如果滚动条没有必要了,请设置此参数来禁用滚动条而不是删除滚动条
    SIF_PAGE 指出nPage成员包含一个页面的大小,单位是像素。
    SIF_POS 指出nPos成员包含滚动条的位置,该数值是从iMin到iMax中的一个值,用户拖拽滚动框的时候不会更新
    SIF_RANGE 指出nMin和nMax成员包含滚动条范围的最小值和最大值
    SIF_TRACKPOS 指出nTrackPos成员包含滚动条的当前位置,用户拖拽时会更新
    比如说你要设置滚动条范围,那么你应该这么写
    cxClient = LOWORD(lParam);
    cyClient = HIWORD(lParam);
    
    si.cbSize = sizeof(si);
    si.fMask = SIF_RANGE;
    si.nMin = 0;
    si.nMax = NUMLINES - 1;
    SetScrollInfo(hWnd, SB_VERT, &si, true);
    
    si.cbSize = sizeof(si);
    si.fMask = SIF_RANGE;
    si.nMin = 0;
    si.nMax = 2 + iMaxWidth / cxChar;
    SetScrollInfo(hWnd, SB_HORZ, &si, true);
    这里有一个新的函数,SetScrollInfo,这个的用法和GetScrollInfo差不多,只不过Get的版本比Set的版本少了最后一个参数fRedraw,这个这个参数为true则滚动条会重画来反应改变,false则不会重画。其余的参数我相信读者能看懂。

    第三步你需要处理WM_HSCROLLWM_VSCROLL消息,

    先来介绍wParam,LOWROD(wParam)指出了请求码,我将它们列在下面

    SB_BOTTOM 滚动到最右端或者最下端,视滚动条类型而定
    SB_ENDSCROLL 结束滚动
    SB_LINEDOWN 向下滚动一行,实际上是将文字向上移
    SB_LINEUP 向上滚动一行,实际上是将文字向下移
    SB_PAGEDOWN 向下滚动一页,
    SB_PAGEUP 向上滚动一页,
    SB_THUMBPOSITION 用户拖拽动作完成后的位置
    SB_THUMBTRACK 用户拖拽中的位置
    SB_TOP 滚动到最左端或者最上端,
    注意:当LOWROD(wParam)为SB_THUMBPOSITION或者SB_THUMBTRACK时,HIWORD(wParam)指出滚动条的位置。

    lParam,在标准滚动条下这个参数不使用,也就是我当前介绍的这种滚动条;还有一种是滚动条控件,我会在后面的文章介绍,这种情况下是滚动条控件的句柄。

    所以我们需要先用GetScrollInfo函数获取当前滚动条的状态信息,然后用switch语句来对不同的请求码做出不同的响应,最后再用SetScrollInfo函数来设置改变后的滚动条信息,然后我给出一段样例代码,

    case WM_VSCROLL:
    	si.cbSize = sizeof(si);
    	si.fMask = SIF_ALL;
    	GetScrollInfo(hWnd, SB_VERT, &si);
    
    	iVertPos = si.nPos;
    
    	switch (LOWORD(wParam))
    	{
    	case SB_TOP:
    		si.nPos = si.nMin;
    		break;
    
    	case SB_BOTTOM:
    		si.nPos = si.nMax;
    		break;
    
    	case SB_LINEUP:
    		si.nPos -= 1;
    		break;
    
    	case SB_LINEDOWN:
    		si.nPos += 1;
    		break;
    
    	case SB_PAGEUP:
    		si.nPos -= si.nPage;
    		break;
    
    	case SB_PAGEDOWN:
    		si.nPos += si.nPage;
    		break;
    
    	case SB_THUMBTRACK:
    		si.nPos = si.nTrackPos;
    		break;
    
    	default:
    		break;
    	}
    
    	si.fMask = SIF_POS;
    	SetScrollInfo(hWnd, SB_VERT, &si, true);
    	GetScrollInfo(hWnd, SB_VERT, &si);
    
    	if (si.nPos != iVertPos)
    	{
    		ScrollWindow(hWnd, 0, cyChar * (iVertPos - si.nPos), nullptr, nullptr);
    		UpdateWindow(hWnd);
    	}
    	break;
    这段代码给出来的是处理垂直滚动条的,大体上和我之前的讲的差不了多少,但是我在这里对一些部分进行重点介绍,

    首先是为什么Set完了之后又有一个Get,并且还要判断改变之后的和当前的是否一样,由于windows的调整,滚动条的位置可能和我们设置的不一样,所以需要再获取一遍并且判断是否一样,如果不一样再滚动。其次,我在前面讲过,nPos应该是一个页面的像素数量,但是这个只是一般的用法,在我上面给出的代码中,nPos实际为cxClient / cxChar,这样子的话nPage实际是一页可以显示的完整的行的数量,设置为cxClient也是可以的。

    这里我再介绍一下ScrollWindow这个函数,函数原型如下

    BOOL ScrollWindow(
      _In_       HWND hWnd,
      _In_       int  XAmount,
      _In_       int  YAmount,
      _In_ const RECT *lpRect,
      _In_ const RECT *lpClipRect
    );
    第一个是窗口句柄;第二个是沿着x轴滚动的数量,以像素为单位;第三个是沿着y轴滚动的数量,以像素为单位;第四个是将要被滚动的矩形的指针,如果为nullptr则整个用户区域都要被重画;第五个是上一个矩形的一部分,从外部滚动到内部的点会被重画,而从内部滚动到外部的点不会被重画。

    注:现在这个函数只是为了提供向后的兼容性而不应该被使用,如果想要使用应该使用ScrollWindowEx函数,这个函数我再此不做介绍,有兴趣的可以google一下。

    最后一步就是处理WM_PAINT消息,这一步你需要显示未被显示的东西。这句话是什么意思呢,ScrollWindow函数实际上做了对滚动区域的像素的移动,但是滚动区域外本来没有像素,那么再滚动完就会有空白出现,此时你就需要填充空白区域。

    到目前位置一个基本的滚动条就可以用了。

    但是一般来说,程序都是要对一些按键响应的,比如对于滚动条来说,你需要对Home,End,PageUp,PageDown等键做出反应,窗口滚动条不需要考虑这些东西,而后面介绍的滚动条控件则需要考虑。

    以上便是本文的全部内容,欢迎指出错误,互相学习。


    展开全文
  • 五:Windows的图形用户界面

    千次阅读 2016-08-01 16:36:36
    基本概念窗口窗口是 Windows 图形用户界面最重要...中间空白部分是客户区,一般用于放置窗口的功能控件、显示内容等,也是程序设计时需要主要处理的内容。窗口类在应用程序开发时,需要注意每一个窗口都属性一个窗口类

    基本概念

    窗口

    窗口是 Windows 图形用户界面最重要的元素。任务图形用户界面的应用程序都需要开窗口。一个典型的窗口包括多个组成部分。最上一栏是标题栏,标题栏包括应用程序图标和窗口标题,标题栏的右边是一组按钮。标题栏下方放置菜单的部分,称为菜单栏。中间空白部分是客户区,一般用于放置窗口的功能控件、显示内容等,也是程序设计时需要主要处理的内容。

    窗口类

    在应用程序开发时,需要注意每一个窗口都属性一个窗口类( Window Class)。每一种窗口类具有对固定的用户输入的处理模式,第一类窗口具有相同的菜单项、背景、图标、鼠标指针样子和窗口消息处理函数。应用程序在创建窗口前,需向系统注册窗口类,或使用系统已经定义好的窗口类(一些公用的控件所需的窗口类已经由系统定义好了)。在注册窗口类时,需指定窗口消息的处理函数。

    消息和消息处理函数

    Windows 系统是消息(Message)驱动的。消息在 Windows 处理用户交互的过程中具有重要作用。当用户操作输入设备,产生硬件中断后,系统内核会得到这些硬件中断,硬件在系统中经过复杂的运算和处理最终变成消息。消息被系统发送给指定窗口。所有的对用户界面的操作都会产生消息,包括鼠标单击、按钮、菜单选择、窗口创建、窗口移动等。Windows 消息种类很多。在创建窗口时,需指定窗口所属的窗口类,前面提到,每一个窗口类都对应一个消息处理函数,因此每一个窗口都具有自己的消息处理函数。程序员在开发窗口应用程序时,需编写窗口消息处理函数消息处理函数是一个回调( Call Back)函数此函数并不是由应用程序调用,而是由系统调用的。应用程序向系统注册了窗口类,创建了窗口,系统在消息产生后,需要窗口消息处理函数来处理时,调用窗口所对应的消息处理函数。
    消息处理函数的功能一般是相应用户在窗口上的操作和输入。比如用户在菜单中选中了一个菜单项,那么就会产生一个消息。然后,窗口的消息处理函数就会被调用。消息处理函数被调用后根据消息的类型和参数判断应该如何处理用户的输入,然后进行相关的处理。这就是 Windows 窗口程序对用户输入的处理模式。
    当然并不是只有用户的输入才会产生消息。在很多情况下,一些随机发生的事件也会产生消息,这些事件可能会对窗口应用程序的运行产生影响,比如系统关机、外设插入、计时器计时到达等。窗口处理函数需根据情况处理所需处理的消息。

    控件

    控件是用户界面开发的重要内容。所谓控件,实际是一种特殊的窗口。Windows 系统将一些常用的窗口模式定义为控件。应用程序可以直接使用这些控件而不需要重新定义。控件有特定的窗口样式、显示设置和消息处理过程。使用控件时不再需要做消息的处理。系统已经为每个控件定义了特定的消息处理模式。比如 Edit 控件就会在将鼠标样式变为一个竖线;在用户输入了文字后,会将文字显示在特定的位置;当用户在按住鼠标右键移动时会选中框住的文字,当用户单击右键时会显示特定的菜单,当用户选择菜单项后,进行的操作也是固定的。这些都是一个控件事先定义好的处理模式。可以说控件是模式化了的窗口。达到了方便用户使用的目的。

    资源

    资源是应用程序在运行中可能会使用到的一些数据。资源包括图标、位图、菜单等。在程序设计时,开发人员可以在资源脚本(.rc)中配置资源,在程序构建时,资源编译器会将资源编译为资源文件(.res),然后由链接器将资源链接到可执行文件中。在程序运行时使用这些资源。

    展开全文
  • 记事本实用程序基本功能是 --> 文字处理 Windows 控制面板窗口中不包含--> 打开 Word 应用程序 Windows 启动后显示在桌面上三个组成部分桌面图标开始按钮 D 盘根目录中文件夹 DATA里可执行文件 TEST D:/DATA...
  • <br />Windows应用程序结构 一个Windows程序一般由头文件、源文件、动态链接库、资源等几部分组成。 1、 主函数 主要完成两个任务:一是创建应用程序界面——窗口;而是建立前面提到过...

    Windows 应用程序的结构

    一个 Windows 程序一般由头文件、源文件、动态链接库、资源等几部分组成。

    1、  主函数

    主要完成两个任务:一是创建应用程序的界面——窗口;而是建立前面提到过的消息循环。

    1)  描述窗口属性的数据结构——窗口类

    2)  注册窗口类

    3)  创建窗口

    4)  显示窗口

    5)  消息循环

    2、  消息的处理部分——窗口函数

    具有窗口界面的 Windows 应用程序,必须要有一个“窗口函数”,各种消息的处理就是在这里完成的,它是完成用户任务的核心,也是需要程序员编写大量代码的地方。

    3、  Windows 系统、主函数、窗口函数之间的关系

    主函数和窗口函数都是由 Windows 系统来调用的函数,只不过主函数是程序启动之后,系统首先调用的函数;而窗口函数是主函数在获得消息并把消息发给系统之后,由系统调用的函数。

    不同消息所对应的操作就是由窗口函数完成的。 Windows 程序员的工作就是编写窗口函数的 case 中的代码。

     

    总结: 1 )程序由两大部分组成:主函数部分和窗口函数部分

               2 Windows 应用程序是靠消息来驱动的,消息时一个描述事件的结构。

             Windows 应用程序的主函数中,首先要注册窗口类,然后创建并显示窗口,创建窗口后程序就进入消息循环,在消息循环中,程序不断地获得消息并将消息派送给对应的窗口函数进行处理

             窗口函数是处理事件的地方,它为 switch…case 结构,每一个 case 对应一段消息响应代码。

             用函数对 Windows 应用程序进行封装可以使程序的结构更为清晰。

    展开全文
  • windows 程序设计

    2011-07-24 21:16:30
    Windows/386(在Windows 2.0之后不久发行)使用Intel 386微处理器「虚拟8086」模式,实现将直接存取硬件多个MS-DOS程序窗口化和多任务化。为了统一起见,Windows版本2.1被更名为Windows/286。 Windows 3.0是...
  • Windows cmd 一些命令

    2019-03-25 17:07:00
    运行是Windows的必要组成部分,可以简单理解为一个应用程序快速调用组件。通过“运行”窗口,可以调用Windows中任何应用程序甚至DOS命令。一般可以搜索百度百科 微软件(窗口) + R 进入运行框 cmd 一种最常用...
  • windowsnt 技术内幕

    2014-04-09 20:47:17
    理解在RISC结构上的Windows NT引导过程 理解Windows NT装载过程 介绍Windows NT装载阶段“服务错误级别” 编辑Boot.ini文件 理解一般引导错误 丢失引导文件后果 利用Expand.exe恢复丢失或损坏引导文件 ...
  •  为了写好Windows操作系统实现部分,《Windows操作系统原理》编写组对Windows2000/XT操作系统体系结构各个组成部分进行了近半年时间分析和研讨。在微软美国总部,他们与该操作系统多位主要开发人员就...
  • 图4.1 工具条和状态栏 如图4.1所示,工具条和状态栏是一个完善的Windows应用程序的重要组成部分(但不是必需的部分)。工具条一般位于主框架窗口的上部,上面有一些图形按钮。当用户用鼠标在某一按钮上单击时,程序...
  • 5.1.1 菜单和加速键的组成 119 5.1.2 菜单和加速键的资源定义 120 5.1.3 使用菜单和加速键 125 5.2 图标和光标 138 5.2.1 图标和光标的资源定义 138 5.2.2 使用图标和光标 139 5.3 位图 143 5.3.1 位图简介 143 ...
  • 工具栏和状态栏也是Windows标准界面的组成部分,工具栏一般位于菜单栏的下方,上面是一些系统定义的或自己定义的图片,可以通俗地显示这个按钮的作 用。状态栏一般位于窗口的最下方,用来显示程序运行中的一些信息...
  • mfc消息机制

    2014-10-26 21:43:32
    这一讲是关于MFC消息映射机制内容。  前面已经说过,Windows应用程序是消息驱动。在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息... 窗口消息一般由三个部分组成:1.一个无符号整
  • GUI:我java笔记(1)

    2008-04-15 14:41:14
    AWT是java中一个包。用于windows窗口的图形编程。 Compent父类: button,Label,List等等 ...java图形用户界面的最基本的组成部分是Component, 一般地Component对象只能放在某一个Contain...
  • 工具条对象类派生于主窗口架框类CframeWnd或CMDIFrameWnd,其类控制CToolBar::GetToolBarCtrl是 MFC类库中封装一个成员函数,允许使用类库中提供一般控制和附加功能,CtoolBar类控制成员控制提供了Windows一般...
  • 2000年12月15日 10:22:00 --------------------------------------------------------------------------------有关工具栏和状态栏工具栏和状态栏也是Windows标准界面的组成部分,工具栏一般位于菜单栏的下方,...
  • CToolBar使用总结(转)

    万次阅读 2009-03-30 13:54:00
    工具条对象类派生于主窗口架框类CframeWnd或CMDIFrameWnd,其类控制CToolBar::GetToolBarCtrl是 MFC类库中封装一个成员函数,允许使用类库中提供一般控制和附加功能,CtoolBar类控制成员控制提供了Windows一般
  • CToolBar使用总结

    千次阅读 2007-06-19 09:24:00
    工具条对象类派生于主窗口架框类CframeWnd或CMDIFrameWnd,其类控制CToolBar::GetToolBarCtrl是 MFC类库中封装一个成员函数,允许使用类库中提供一般控制和附加功能,CtoolBar类控制成员控制提供了Windows一般...
  • 关于MFC中树形控件(CTreeCtrl)复选框(CheckBox)显示一致性解决方案 ...树形控件节点一般都由标签和图标两部分组成,图标用来抽象描述数据,能够使树形控件层次关系更加清晰。 1.关于MFC树形控件基础知识 参
  • 图示窗口的上半部分显示图的逻辑结构,初始状态用青色圆圈表示顶点,结点间的黑色连线表示边或弧(连线上画有箭头)。演示过程中用红色覆盖已访问的顶点和边(或弧)。窗口下方显示图的邻接表,演示过程中以红色框边...
  • 工具条对象类派生于主窗口架框类CframeWnd或CMDIFrameWnd,其类控制CToolBar::GetToolBarCtrl是MFC类库中封装一个成员函数,允许使用类库中提供一般控制和附加功能,CtoolBar类控制成员控制提供了Windows一般...
  • VC++ 项目中使用 FLEX

    2010-12-08 08:55:00
    复杂界面有多层窗口组成,当windows窗口改变大小时候是先重画父窗口,然后重画子窗口,子父窗口重画过程一般无法在一个刷新周期内完成,所以会呈现闪烁。我们知道父窗口上被子窗口挡住的部分其实没必要重画...
  • Win32汇编教程六

    2006-11-24 12:52:00
    有关工具栏和状态栏 工具栏和状态栏也是Windows标准界面的组成部分,工具栏一般位于菜单栏的下方,上面是一些系统定义的或自己定义的图片,可以通俗地显示这个按钮的作用。状态栏一般位于窗口的最下方,用来显示程序...
  • NeheOpenGL教程电子书

    2018-04-07 12:25:03
    当今显卡的强大功能,你几乎什么都不用做,只需要在创建窗口的时候该一个数据。看看吧,驱动程序为你做完了一切。 47.CG 顶点脚本 nVidio的面向GPU的C语言,如果你相信它就好好学学吧,同样这里也只是个入门。...
  • MFC消息映射机制概述

    2018-09-02 08:35:05
    MFC消息映射机制概述 Windows应用程序是消息驱动。在MFC软件开发中,界面操作或者线程之间...窗口消息一般由三个部分组成: 一个无符号整数,是消息值; 消息附带WPARAM类型参数; 消息附带LPARAM类型...
  • MFC消息映射机制

    2019-10-01 22:11:51
    Windows应用程序是消息驱动。在MFC软件开发中,界面操作或者线程之间通信都会经常...窗口消息一般由三个部分组成:1.一个无符号整数,是消息值;(2)消息附带WPARAM类型参数;(3)消息附带LPARAM类型参数...

空空如也

空空如也

1 2 3 4 5 6
收藏数 101
精华内容 40
关键字:

windows一般窗口的组成部分