barriers / 阅读 / 详情

windows程序怎样实现统计WM_PAINT消息的次数?

2023-06-28 06:13:58
TAG: nt ndo
共1条回复
meira

系统以messages的形式将输入传递给窗口过程。消息可以被系统和应用程序产生。系统产生消息当每一次输入事件发生,如当用户敲键盘,移鼠标,或者单击滚动条。系统也用消息来响应由于应用程序引起的系统变化。如应用程序改变系统字体资源或者改变它的一个窗口。应用程序产生消息来让他的窗口执行一些任务或者与其他应用程序的窗口通讯。

系统发送消息给窗口过程并传递4个参数,windows句柄, 消息标识符, 2个消息参数。系统使用窗体句柄来决定那个窗口过程来接受消息。

消息标识符以常量命名指出消息的含义。当窗口过程接收到消息,使用消息标识符决定如何处理消息。例如、WM_PAINT告诉窗口过程窗体客户区被改变了需要重绘。

消息参数指定被窗口过程使用的数据和数据的位置。其含义和值取决于消息类型。消息参数可以包含一个整数, 标志位,一个指针等。 当消息不使用消息参数时,他们被设置位NULL。一个Window窗口过程必须根据消息标识符来决定如何解释消息参数。

Message Types

This section describes the two types of messages:

· System-Defined Messages

· Application-Defined Messages

System-Defined Messages

当系统和应用程序通讯时,系统post和send系统定义消息。他使用消息来控制应用程序的操作,提供输入和其他信息让应用程序处理。应用程序也可以post或者send系统定义消息。

每一个系统定义消息由一个唯一的标识符与一致的常量以声明消息的含义。例如 WM_PAINT 要求窗口绘制它的内容。

符号常量指定系统定义消息属于的类别,常量的前缀指定处理解释消息的窗体的类型。以下使一些前缀和他们相关的消息类别。

Prefix Message category

ABM Application desktop toolbar

BM Button control

CB Combo box control

CBEM Extended combo box control

CDM Common dialog box

DBT Device

DL Drag list box

DM Default push button control

DTM Date and time picker control

EM Edit control

HDM Header control

HKM Hot key control

IPM IP address control

LB List box control

LVM List view control

MCM Month calendar control

PBM Progress bar

PGM Pager control

PSM Property sheet

RB Rebar control

SB Status bar window

SBM Scroll bar control

STM Static control

TB Toolbar

TBM Trackbar

TCM Tab control

TTM Tooltip control

TVM Tree-view control

UDM Up-down control

WM General window

通用窗体消息覆盖了很大一个信息和请求的范围, 包括鼠标键盘消息, 菜单对话框的输入, 窗体产生与管理, 动态数据交换 (DDE).

Application-Defined Messages

应用程序可以产生自己用的消息或者与其他进程中窗体通讯。如果应用程序产生自己的消息,窗口过程接受并且必须提供合适的处理。

系统保留消息标识符的值在0x0000在0x03ff(WM_USER-1)范围。这些值被系统定义消息使用。 应用程序不能使用这些值给自己的消息。

private window classes用0x0400(WM_USER)到0x7fff消息标识符

· If your application is marked version 4.0, you can use message-identifier values in the range 0x8000 (WM_APP) through 0xBFFF for private messages.

系统使用RegisterWindowMessage来注册消息,返回一个消息标识符范围在0XC000到0XFFFF,使用这个函数来保证整个系统范围内是唯一的

Message Routing

系统有两个方法将消息传递到窗口过程。Post一个消息到先进先出的消息队列。系统定义的临时内存对象。和直接 send消息到窗口过程。

被发送到消息队列的消息称做入队消息,主要是由鼠标键盘输入,例如 WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_KEYDOWN, and WM_CHAR messages。还包括定时器, 刷新, 退出: WM_TIMER, WM_PAINT, and WM_QUIT。其他直接发送到窗口过程的消息被称为 非入队消息。

Queued Messages

系统可以显示任何数量的窗体同一时间。为了传递鼠标键盘消息到合适的窗口,系统使用消息队列。

系统维护一个系统消息队列和每一个GUI线程的消息队列,为避免给non-GUI现成创建消息队列,所有线程产生时并没有消息队列。仅当线程第一次调用GDI函数时,系统给线程创建一个消息队列。只要用户移动鼠标,点击鼠标,敲键,驱动程序将其转换为消息将他们放在系统消息队列中。系统将他们从系统消息队列中移走,检查他们的目标窗口,然后将他们发送到创建目标窗口的线程的消息队列。线程消息队列接收由这个线程创建的所有窗口的鼠标键盘消息。线程删除消息系统调用窗口过程进行处理。

WM_PAINT是一个例外,系统总是将消息Post在消息队列的末尾。这样保证窗口以先进先出的顺序接受消息。然而, 仅当没有其他消息时WM_PAINT才被传递窗口过程。同一个窗口的多个 WM_PAINT被合并成一个 WM_PAINT 消息, 合并所有的无效区域到一个无效区域。合并WM_PAIN减少了刷新窗口的次数。

系统通过填充MSG结构并将它复制到消息队列来发送消息到线程队列。MSG结构包括:窗口句柄,消息标识符,两个消息参数。 消息被posted的时间, 和鼠标的位置。线程可以使用PostMessage和PostThreadMessage来给发送消息到自己消息队列或者另一个线成的消息队列。

应用程序可以使用GetMessage从消息队列删除消息。可以使用 PeekMessage来检查一个消息而不删除它。 这个函数将消息队列的消息填充到MSG结构。

在从消息队列删除了一个消息,应用程序可以使用DispatchMessage使系统将消息发送到窗口过程来处理。DispatchMessage拥有一个指向由GetMessage或者PeekMessage填充的MSG结构的指针,传递窗口句柄,消息标识符,消息参数给窗口过程。但它并不传递消息发送的时间和鼠标的位置,应用程序可以通过GetMessageTime和GetMessagePos来得到这些信息。

线程可以使用WaitMessage将控制交给其他线程当消息队列中没有他的消息队烈时,这个函数挂起线程,并不返回,直到新的消息放置于消息队列中。

你可以调用SetMessageExtraInfo函数来关联一个值到当前线程的消息队列。调用GetMessageExtraInfo来得到这个与最后一次通过GetMessage或者PeekMessaage获得的消息关联得值。

Nonqueued Messages

非入队消息即直接发送到窗口过程的消息,绕过系统队列和线程消息队列。系统发送非入队消息通知一个窗口事件,例如,当用户激活一个新的应用程序窗口,系统发送WM_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR。这些消息通知窗口它被激活了,键盘输入被直接传递到窗口,鼠标在当前窗口内移动。 非入队消息也可以由当应用程序调用系统函数产生。例如,当程序调用SetWindowPos系统发送WM_WINDOWPOSCHANGED消息。

一些函数也发送非入队消息如 BroadcastSystemMessage, BroadcastSystemMessageEx, SendMessage, SendMessageTimeout, and SendNotifyMessage.

Message Handling

应用程序必须移除和处理被post到消息队列的消息。单线程应用程序通常在WinMain使用消息循环来移除和分发消息到何时窗口过程来处理。多线程应用程序可以在每一个创建窗口的线程中中包含消息循环。

Message Loop

A simple message loop consists of one function call to each of these three functions: GetMessage, TranslateMessage, and DispatchMessage. Note that if there is an error, GetMessage returns -1 -- thus the need for the special testing.

Show Example

MSG msg;

BOOL bRet;

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)

{

if (bRet == -1)

{

// handle the error and possibly exit

}

else

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

GetMessage 函数从消息队列获得一个消息并将它复制到MSG结构。他返回一个非0值,除非遇到WM_QUIT消息。否则它返回0然后结束循环。In a single-threaded application, ending the message loop is often the first step in closing the application. 应用程序可以使用PostQuitMessage来结束自己的消息循环。通常在主窗口的WM_DESTROY消息中调用。

如果你将一个窗口句柄作为第二个参数传入GetMessage,那么只有指定窗口的的消息可以从队列中获得。GetMessage也可以从消息队列中过滤消息只接受消息队列中落在范围内的消息。详细见消息过滤。 一个线程循环必须包括TranslateMessage如果线程接受键盘的字符输入。每一次用户按键系统产生虚拟键消息,一个虚拟键消息包含虚拟键用来标志那个键被按下,并不是他的字符值,要获得这个值消息循环必须调用TranslateMessage,用于将虚拟键转换为字符消息WM_CHAR然后将它放回应用程序消息队列。通过将它转发到窗口过程,字符消息被删除。

DispatchMessage 函数分发消息到MSG结构中的窗口句柄关联的窗口过程。如果窗口句柄是HWND_TOPMOST,DispatchMessage分发消息到系统中的所有的top-level窗口的窗口过程。如果句柄是NULL,DispatchMessage不做任何事。

应用程序得主线程在初始化,创建至少一个窗口后启动它的消息循环,一旦启动消息循环持续从线程队列中获得消息,然后分发他们到合适的窗口。消息循环在通过GetMessage得到WM_QUIT并将他从队列中删除后结束。

一个消息都列仅需要一个消息循环, 即使程序包含很多窗口。DispatchMessage 总是分发消息到合适的窗口,这是因为MSG结构包含消息所属的窗口的句柄。

你可以用各种方式修改消息循环。例如,从消息队列获得消息消息但不把他们分发到窗口中去。当应用程序发送一个消息但不指定窗口时是有用的。你可以用GetMessage获得一个特定的消息,而保留其他消息在消息队列。当你需要改变先进先出的顺序时是有用的。

应用程序使用加速键必须将键盘消息转换为WM_COMMAND消息。所以消息循环必须包括TranslateAccelerator函数。详细信息参见加速键。

如果线程使用非模态对话框,消息循环必须包括 IsDialogMessage 以使非模态对话框获得键盘输入。

Window Procedure

窗口过程是一个用于处理所有发送到这个窗口的消息的函数。任何一个窗口类都有一个窗口过程。同一个类的窗口使用同样的窗口过程来响应消息。

系统发送消息给窗口过程将消息数据作为参数传递给他,窗口过程使用参数产生合适行为。

一个窗口过程通常不忽略消息,如果他不处理,它会将消息传回到执行默认的处理。窗口过程通过调用DefWindowProc来做这个处理。窗口过程必须return一个值作为它的消息处理结果。大多数窗口只处理小部分消息和将其他的通过DefWindowProc传递给系统做默认的处理。

因为窗口过程是同一个类的窗口共享的,它可以为不同的窗口处理消息。通过检查消息中的窗口句柄来找到被消息影响的窗口。详细信息请看Window Procedures。

Message Filtering

应用程序可以从消息队列选择特定的消息。使用GetMessage或者PeekMessage并指定一个消息过滤器。这个过滤器是一个消息标识符的范围或者是一个窗体句柄,或者两者同时指定。GetMessage和PeekMessage使用过滤器来选择从消息队列中获得那些消息。当应用程序要查找一个后入消息队列的消息是很有用。

一个应用程序过滤消息时必须保证符合过滤条件的消息能被发送。例如应用程序在窗口中过滤WM_CHAR并不能得到键盘输入,GetMessage并不返回。这将挂起应用程序。

Posting and Sending Messages

应用程序可以post和send消息,通过将消息复制到消息队列即post消息,send消息将消息数据作为参数直接传递到窗口过程。

可以使用PostMessage来post消息,SendMessage,BroadcastSystemMessage, SendMessageCallback, SendMessageTimeout, SendNotifyMessage, or SendDlgItemMessage来send消息。

Posting Messages

应用程序post消息通知指定窗体执行任务。PostMessage可以创建MSG结构并将它Copy到消息队列。消息循环最终捕获消息并分发到合适的窗口过程。

给PostMessage传递一个NULL句柄不指定哪一个窗口,这个消息就被发送到当前线程消息队列,应用程序必须在消息处理中处理这个消息。这是为整个应用程序发送消息的一个方法。

偶尔你可以使用HWND_TOPMOST 这个参数作为句柄参数向所有的top-level窗口发送消息。

当消息队列满的时候PostMessage并不发送消息,应用程序需要检查PostMessage函数的返回值来确定消息是否被发送,或者没有需要重发。

Sending Messages

通过Send消息来通知窗口过程立即执行任务。SendMessage将消息发送给指定窗口的窗口过程。函数将等待窗口过程处理完才返回一个消息结果。父窗口和子窗口通常使用Send消息来互相通讯。例如,一个父窗口拥有以一个文本框作为它的子窗口,它可以通过发送消息到子窗口来给文本框设置文字。子窗口也可将文字被用户改变的消息发送给父窗口。

SendMessageCallback也将消息发送给指定窗口的窗口过程,但是他立即返回。在窗口过程处理完消息后,系统调用指定的回调函数,回调函数的详细资料参见SendAsyncProc

偶尔,你可以发送消息系统中到所有的top-level窗口,例如,应用程序改变了系统时间。它必须以HWND_TOPMOST作为句柄参数发送一个WM_TIMECHANGE 消息通知所有的top-level窗口,你也可以将lpdwRecipients 指定为BSM_APPLICATIONS 用BroadcastSystemMessage函数向所有应用程序广播。

可以使用InSendMessage或者InSendMessageEx函数,窗口过程可以判断它处理的消息是否是由其他线程调用SendMessage发送过来的。This capability is useful when message processing depends on the origin of the message.

Message Deadlocks

一个线程可以调用SendMessage想其他线程发送消息,这个线程不能继续执行直到获得消息得窗口过程返回。如果接受消息的线程处理消息时yields控制,发送线程的消息将永远得不到执行,因为他在等待SendMessage返回。如果接受线程和发送线成语同一个消息队列联系起来,它可能导致消息死锁。

Note that the receiving thread need not yield control explicitly; calling any of the following functions can cause a thread to yield control implicitly.

接受线程不需要明确yield控制,下面任何一个函数回导致一个线程明确yield控制。

· DialogBox

· DialogBoxIndirect

· DialogBoxIndirectParam

· DialogBoxParam

· GetMessage

· MessageBox

· PeekMessage

· SendMessage

为了避免潜在的死锁,可以使用SendNotifyMessage 或者 SendMessageTimeout,否则窗口过程,将用InSendMessage或者InSendMessageEx判断消息是否由另一个线程发送过来。当调用前面任何一个函数窗口过程将首先调用InSendMessage或者InSendMessagEx,如果函数返回true窗口过程必须在引起线程yeild控制前调用ReplyMessage 。

Broadcasting Messages

每一个消息包括消息标识符和两个参数,wParam和lParam,消息标识符是唯一的代表这个消息的含义。参数提供与消息相关的额外的信息,但是wParam参数通常是一个类型值提供更多的消息信息。

消息广播是简单的将消息发送到系统中的多个接收者。使用BroadcastSystemMessage函数来广播消息,你必须指定一个或者多个接收者类型,这些类型可以是applications, installable drivers, network drivers, and system-level device drivers。系统将消息发送给指定类型的所有成员。

系统广播消息来响应系统设备驱动程序或者组件的变化。驱动程序或相关组件广播消息给应用程序和其他组件以通知他们这些变化。例如,负责磁盘响应的组件广播消息只要软盘驱动程序发现媒体的变化,如当用户将磁盘插入驱动器。

系统按一下顺序广播消息给接收者:系统级的设备驱动程序,网络驱动程序,installable drivers,和应用程序。意味着如果系统级设备驱动程序作为接收者总是第一个有机会来响应消息。在接受者类型中,没有一个驱动程序能保证在其他驱动程序前接受一个消息。即一个给特定驱动程序的消息必须有一个全局唯一的标志使其他不关心这个消息的驱动程序不处理它。

你也可以广播消息给所有顶层窗口通过在SendMessage等函数中指定HWND_BROADCAST。

应用程序通过顶层窗口的窗口过程来接收消息。消息不发送到子窗口。服务可以接收消息通过窗口过程或者他们的服务控制函数。

Query Messages

你可以创建自定义的消息使用它们来调整你的应用程序和其他组件之间的行为。这个非常有用如果你已创建你自己的installable drivers和系统机设备驱动程序。你的驱动程序和使用这个驱动程序的应用程序可以通过自定义消息互相传递信息。

To poll recipients for permission to carry out a given action, use a query message.你可以通过在dwFlags参数中设置BSF_QUERY调用BroadcastSystemMessage。每一个query message的接收者必须返回TRUE来将消息发送到下一个接收者。如果任何一个接收者返回BROADCAST_QUERY_DENY,广播立即停止函数返回0。

Windows 95/98/Me: 你可以创建广播和处理消息的installable drivers。一个installable drivers是一个导出DriverProc函数的dll。驱动程序通过它的DriverProc来接收消息。Installable drivers典型的用来支持多媒体设备,例如sound boards,也可以用于其他设备和目的。

Windows 95/98/Me: 网络驱动程序是给应用程序提供以下支持的dlls。系统级设备驱动程序是系统特定的提供直接访问和管理计算机硬件的可执行组件。这些组件如何处理系统消息超出了这篇文章的范围。

程序出错,帮忙看下, 很简单的。谢谢咯

相关推荐

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

函数调用失败。目测应该是msg.hwnd的原因,这个是消息句柄,但是第一个参数需要的是当前窗口句柄,消息句柄不一定是窗口句柄
2023-06-28 01:53:022

什么是键盘加速键?

键盘加速键加速键是产生WM_COMMAND消息(有些情况下是WM_SYSCOMMAND)的键组合。许多时候,程序使用加速键来重复常用菜单项的动作(然而,加速键还可以用于运行非菜单功能)。例如,许多Windows程序都有一个包含“Delete”或“Clear”选项的“Edit”菜单,这些程序习惯上都将Del键指定为该选项的加速键。使用者可以通过“ Alt 键”从菜单中选择“ Delete ”选项,或者只需按下加速键 Del 。当窗口消息处理程序收到一个WM_COMMAND消息时,它不必确定使用的是菜单还是加速键。为什么要使用加速键您也许会问:为什么我应该使用加速键?为什么不能直接拦截WM_KEYDOWN或WM_CHAR消息而自己实现同样的菜单功能呢?好处又在哪里呢?对于一个单窗口应用程序,您当然可以拦截键盘消息,但是使用加速键可以得到一些好处:您不需要把菜单和加速键的处理方式重写一遍。对于有多个窗口和多个窗口消息处理程序的应用程序来说,加速键是非常重要的。正如我们所看到的,Windows将键盘消息发送给目前活动窗口的窗口消息处理程序。然而对于加速键, Windows把WM_COMMAND消息发送给窗口消息处理程序,该窗口消息处理程序的代号在Windows函数TranslateAccelerator中给出。通常这是主窗口,也是拥有菜单的窗口,这意味着无须每个窗口消息处理程序都把加速键的操作处理程序重写一遍。如果您在主窗口的显示区域中,使用了非系统模态对话框(在下一章中会讨论)或者子窗口,那么这种好处就变得非常重要。如果定义一个特定的加速键以便在不同的窗口之间移动,那么,只需要一个窗口消息处理程序有这个处理程序。子窗口就不会收到加速键引发的WM_COMMAND消息。
2023-06-28 01:53:122

解释:什么是键盘加速键

电脑中许多的名词相信使用电脑的人都有所了解,但对于键盘加速键你了解多少呢?如果不了解,那么好,现在就开始学习吧,也因此又让你增加对电脑的了解。加速键是产生WM_COMMAND消息(有些情况下是WM_SYSCOMMAND)的键组合。许多时候,程序使用加速键来重复常用菜单项的动作(然而,加速键还可以用于运行非菜单功能)。例如,许多Windows程序都有一个包含Delete或Clear选项的Edit菜单,这些程序习惯上都将Del键指定为该选项的加速键。使用者可以通过 Alt 键从菜单中选择 Delete 选项,或者只需按下加速键 Del 。当窗口消息处理程序收到一个WM_COMMAND消息时,它不必确定使用的是菜单还是加速键。对于有多个窗口和多个窗口消息处理程序的应用程序来说,加速键是非常重要的。正如我们所看到的,Windows将键盘消息发送给目前活动窗口的窗口消息处理程序。然而对于加速键, Windows把WM_COMMAND消息发送给窗口消息处理程序,该窗口消息处理程序的代号在Windows函数 TranslateAccelerator中给出。通常这是主窗口,也是拥有菜单的窗口,这意味着无须每个窗口消息处理程序都把加速键的操作处理程序重写一遍。如果您在主窗口的显示区域中,使用了非系统模态对话框(在下一章中会讨论)或者子窗口,那么这种好处就变得非常重要。如果定义一个特定的加速键以便在不同的窗口之间移动,那么,只需要一个窗口消息处理程序有这个处理程序。子窗口就不会收到加速键引发的WM_COMMAND消息。
2023-06-28 01:53:301

VC中如何定义快捷键(转)

一是在PreTranslateMessage函数中,判断键盘的按键消息,比如快捷键是Ctrl + Q,我们就检测按键消息的Ctrl键和Q是否同时按下就可以了。 //用PreTranslateMessage的方法,判断Ctrl+Q是否按下,按下就执行快捷键对应的操作 if(pMsg->message == WM_KEYDOWN && pMsg->wParam == "Q" && IsCTRLPressed()) { AfxMessageBox("Ctrl + Q 被按下"); return TRUE; } 二是在PreTranslateMessage函数中,通过载入快捷键资源,并建立快捷键与消息的映射的方法来实现。先插入快捷键资源,通过下面的代码来载入该资源。 HACCEL hAcc; hAcc = LoadAccelerators(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1)); 在PreTranslateMessage函数中进行快捷键的翻译,如果是WM_KEYDOWN和WM_SYSKEYDOWN消息就翻译,翻译成功返回TRUE。 BOOL CAccelerator2Dlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class int iResult; //针对WM_KEYDOWN消息和WM_SYSKEYDOWN消息,翻译快捷键 switch(pMsg->message) { case WM_KEYDOWN: case WM_SYSKEYDOWN: iResult = TranslateAccelerator(m_hWnd,hAcc,pMsg); //翻译快捷键成功,返回TRUE if(iResult) return TRUE; } return CDialog::PreTranslateMessage(pMsg); } 下面处理快捷键对应的响应,在该实例中,快捷键表中建立了Ctrl +Q,Shift + Q,Alt + Q,Ctrl + Shift + Q,Ctrl + Alt + Q,Shift + Alt + Q,Ctrl + Shift + Alt + Q六个快捷键分别进行测试。 void CAccelerator2Dlg::OnCtrlQ() { // TODO: Add your control notification handler code here AfxMessageBox("你按下了定义的快捷键"); } 两种方法的比较:第一中方法显然比较直接,仅应用于快捷键比较少的程序。第二种方法比较实用。
2023-06-28 01:53:391

WINDOWS消息处理过程

2023-06-28 01:53:541

c++ win32控制台的程序怎么改成win32应用程序???

你别改应用程序的main函数名字啊。你复制其他的进去就可以了
2023-06-28 01:54:043

如何在c语言中实现ctrl+z

在资源文件写110 ACCELERATORS{"z", 4000, VIRTKEY, CONTROL}在窗口过程中的 command 消息中添加 4000 消息处理加上 hAcce = LoadAccelerators(hInstance,110);在GetMessage循环里加上TranslateAccelerator(hWnd,hAcce,&Msg)以上是在Windows编程中
2023-06-28 01:54:111

纯C++ 判断按钮Click事件(按钮是否按下)

鼠标事件啊
2023-06-28 01:54:198

C语言图形界面怎么做出来

VC里可以用windows的API接口
2023-06-28 01:54:374

我家键盘上的粘贴快捷键怎么不管用啦,

先看一下用右边的CTRL加上组合键看看能不能用!如果也不能用那肯定不是键盘的事情(除非你的两个CTRL键都坏了)再到控制面板/辅助功能选项/键盘里看看是否有没有什么问题!或是检查一下输入法的状态,尝试切换输入法后用CTRL组合键看是否可用!以前我们单位有台电脑总是无法输入|和@等符号,后来检查是输入法状态的问题,删除掉En的输入法状态(因为系统启动默认是En而不是CH),问题就解决了!还有可能就是安装了什么支持CTRL组合键的软件,比如抓图的工具SNAGIT,启动后它默认的抓屏操作快捷键为CTRL+SHIFT+P,操作中与输入法切换的键有冲突!有时经常会将输入面板抓到图里,几次非常的上火,后来才发现是快捷键的原因!
2023-06-28 01:55:171

急问C++如何创建新窗口用来画图?!

请区分C++和VC!
2023-06-28 01:56:142

键盘ctrl快捷键不管用

应该是你的系统的,快捷方式比如“Crtl+A”“Ctrl+C”被某些软件给恶意注册或屏蔽了,这样你的Crtl组合键就相当于没有用了。
2023-06-28 01:56:211

用C语言怎么实现图形化界面?

整体来讲, 用C语言实现图形化需要API函数, 在windows.h中声明. 但是它和C语言控制台下编程的区别可以说除了语法一样, 什么东西都不剩下. C库函数能实现的, API函数也全部都能实现, 而且功能更强大. 因此需要记忆的东西也就更多了, 但是绝对不可能把所有的API函数的用法全部知道, 只是知道大概, 一部分. 剩下不清楚, 或完全不懂的可以直接上MSDN, 百度百科或其他网站上去查询. 但是如果其他网站与MSDN说明有出入, 一定要以MSDN的为准. 所以"怎么用C实现图形化界面"在这里是不可能能说清的.
2023-06-28 01:56:312

一个简单的win32窗口程序

给你一个可以运行的范例程序吧,这个文章下面有下载cpp文件的链接,带注释,直接在VC中就可以运行。http://www.yangfei.org/post/50.html#include<windows.h>LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数说明int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow){ WNDCLASS wndclass;//定义窗口类结构变量 HWND hwnd;//定义窗口句柄 MSG msg;//定义消息结构变量 /*定义窗口类的各属性*/ wndclass.style=CS_HREDRAW|CS_VREDRAW;//改变窗口大小则重画 wndclass.lpfnWndProc=WndProc;//窗口函数为WndProc wndclass.cbClsExtra=0;//窗口类无扩展 wndclass.cbWndExtra=0;//窗口实例无扩展 wndclass.hInstance=hInstance;//注册窗口实例句柄 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//用箭头光标 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//背景为白色 wndclass.lpszMenuName=NULL;//窗口默认无菜单 wndclass.lpszClassName=TEXT("window窗口创建");//窗口类名为windows窗口创建 /*注册窗口类*/ if(! RegisterClass(&wndclass))return FALSE; /*创建窗口*/ hwnd=CreateWindow(TEXT("window窗口创建"), //窗口类名window窗口创建 TEXT("window窗口创建"),//窗口名window窗口创建 WS_OVERLAPPEDWINDOW,//重叠式窗口CW_USEDEFAULT,CW_USEDEFAULT,//左上角屏幕坐标默认值 CW_USEDEFAULT,CW_USEDEFAULT,//窗口宽度和高度默认值 NULL,//此窗口无父窗口 NULL,//此窗口无主菜单 hInstance,//创建此窗口的实例句柄 NULL);//此窗口无创建参数 /*显示并更新窗口*/ ShowWindow(hwnd,nCmdShow);//显示窗口 UpdateWindow(hwnd);//更新窗口的客户区 /*消息循环*/ while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg);//键盘消息转换 DispatchMessage(&msg);//派送消息给窗口函数 } return msg.wParam;//返回推出值} /*窗口函数*/LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){ //根据消息值转相应的消息处理 switch(message) { case WM_PAINT://重画窗口客户区消息处理 HDC hdc;//定义设备描述表句柄 PAINTSTRUCT ps;//定义绘图星系结构变量 hdc=BeginPaint(hwnd,&ps);//获取要重画的窗口的设备描述表句柄 TextOut(hdc,10,20,TEXT("哈哈,windows编程窗口!!"),16);//输出文本 EndPaint(hwnd,&ps);//结束要重画的窗口 return 0; case WM_DESTROY://撤销窗口消息处理 PostQuitMessage(0);//产生推出程序消息WM_QUIT return 0; } return DefWindowProc(hwnd,message, wParam,lParam); //其他转默认窗口函数}
2023-06-28 01:56:571

求用c语言编写的人机对战五子棋的源代码,要能运行的,简单点就好,初学C的学生

初学C就写这么复杂的代码?
2023-06-28 01:57:135

VC++6.0main函数在哪里

主函数 WinMain(....)主函数中还有一个消息循环 while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); }窗口过程函数 WndProc(....)窗口注册函数 MyRegisterClass(...)以下三个参数很重要wcex.lpfnWndProc = (WNDPROC)WndProc;wcex.hInstance = hInstance;wcex.lpszClassName = szWindowClass;
2023-06-28 01:57:334

为什么全局变量在回调函数中变化值不改变

没有听说回调函数访问全局变量有什么特别要注意的地方,可能是其他地方出问题了。 一般不太需要用到全局变量吧,你把它放到类里作为一个public的成员变量试试,如果你的回调函数是静态的类成员,记得给这个成员变量也加上static。
2023-06-28 01:57:591

使用c语言编写一个人机对战下棋程序

2023-06-28 01:58:201

关于PostThreadMessage能实现进程间通信吗

用普通的创建窗口类,注册窗口类,创建窗口,更新窗口。。。消息循环这样的方式创建了一个app,然后在消息循环中判断while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)&&(msg.hwnd!=NULL)){TranslateMessage(&msg);DispatchMessage(&msg);}else if(msg.message==WM_MYMESSAGE){MessageBox(NULL,TEXT("消息从进程A中传送过来了!"),TEXT("恭喜"),MB_OK);}}这样确实就接受到了消息,说明了一点:PostThreadMessage确实可以实现进程间通信的。
2023-06-28 01:58:271

电脑的相关知识

  什么是键盘加速键,为什么要使用加速键?    什么是键盘加速键?   加速键是产生WM_COMMAND消息(有些情况下是WM_SYSCOMMAND)的键组合。许多时候,程序使用加速键来重复常用菜单项的动作(然而,加速键还可以用于运行非菜单功能)。例如,许多Windows程序都有一个包含“Delete”或“Clear”选项的“Edit”菜单,这些程序习惯上都将Del键指定为该选项的加速键。使用者可以通过“ Alt 键”从菜单中选择“ Delete ”选项,或者只需按下加速键 Del 。当窗口消息处理程序收到一个WM_COMMAND消息时,它不必确定使用的是菜单还是加速键。    为什么要使用加速键?   您也许会问:为什么我应该使用加速键?为什么不能直接拦截WM_KEYDOWN或WM_CHAR消息而自己实现同样的菜单功能呢?好处又在哪里呢?对于一个单窗口应用程序,您当然可以拦截键盘消息,但是使用加速键可以得到一些好处:您不需要把菜单和加速键的处理方式重写一遍。   对于有多个窗口和多个窗口消息处理程序的应用程序来说,加速键是非常重要的。正如我们所看到的,Windows将键盘消息发送给目前活动窗口的窗口消息处理程序。然而对于加速键, Windows把WM_COMMAND消息发送给窗口消息处理程序,该窗口消息处理程序的代号在Windows函数 TranslateAccelerator中给出。通常这是主窗口,也是拥有菜单的窗口,这意味着无须每个窗口消息处理程序都把加速键的操作处理程序重写一遍。   如果您在主窗口的显示区域中,使用了非系统模态对话框(在下一章中会讨论)或者子窗口,那么这种好处就变得非常重要。如果定义一个特定的加速键以便在不同的窗口之间移动,那么,只需要一个窗口消息处理程序有这个处理程序。子窗口就不会收到加速键引发的WM_COMMAND消息。   电脑入门,360使用小常识   下载完360安全卫士,我们会发现,出现一个界面,它就会自动测试,下面我们直接点击一键修复即可。它就会自动修复我们电脑中的一些问题,这个比较方便,而且比较受大家喜爱的一款软件。对于我们这些菜鸟来讲,比较实用。   有的时候底下会出现要升级的软件,怎么办呢,有的人总也搞不明白,一出来就有这个,得升级。你会发现右面有个查看的按钮,我们点击查看,看看到底是什么软件要升级。点击查看的时候,会出现一个框我们直接点升级。   一键升级以后,它就自己下载了。我们需要等待一下。当然可以点击最小化放到电脑最底部的位置。右面点第二个—这个,然后我们就会发现它出现再了电脑最底部的位置,这样比较方便一些。   安装完一会我们把升级的软件可以放到c盘,也可以放到d盘,根据重要性而选择。   键盘上的快捷键你知道几个呢   现在我们来介绍一下,有可能有的菜鸟级的还是不知道。切换的,有两个一个是ALT+TAB切换还有一个是ALT+ESC切换。而ALT+空格键窗口菜单。CTRL+ESC是开始菜单当然这个比较常用,所以大家也可以记住一下。   有的人不知道键盘的页面如何放大或者缩小,那么我们就要用到Ctrl+小键盘"+" 当前页面放大20%而Ctrl+小键盘"-" 当前页面缩小20%。如果想要恢复Ctrl+小键盘"*" 恢复当前页面的缩放为原始大小。这个很实用吧!   下面介绍一下软件中的实用快捷键因为有很多财务级的或者总用电脑操作的会经常用到。首先第一个Ctrl+L 打开“打开”面版,当然这个也是我们要知道的。Ctrl+N 新建一个空白窗口直接快速就新建了,比如WORD文档,这个就不用点击上面那个word然后点击新建,新建文档了,这个非常实用,建议大家学会这个快捷键。   其次就是Ctrl+O 打开“打开”面版(可以在当前页面打开Iternet地址或其他文件...)这个了解一下就可以而Ctrl+P 打开“打印”面板,这个是可以打印网页,图片什么的。以上就是我为大家推荐的快捷键,当然还有很多,我们可以上网查一下。   电脑硬盘容量与标称不符是什么原因?   电脑系统预装Linux系统,重装XP系统后发现硬盘由原来的250GB变成233GB,怎么会这样呢?那导致电脑硬盘容量与标称不符是什么原因?   在操作系统当中显示的硬盘的容量与硬盘标称的容量不符,都要少于标称容量,容量越大则这个差异越大,这并不是厂商或经销商以次充好欺骗消费者,而是硬盘厂商对容量的计算方法和操作系统的计算方法不同而造成的,即不同的单位转换关系造成的。   众所周知,在计算机中是采用二进制,这样造成在操作系统中对容量的计算是以每1024为一进制的,每1024字节为1KB,每1024KB为 1MB。 每1024MB为1GB:而硬盘厂商在计算容量方面是以每1000为一进制的.每1000字节为1KB,每1000KB为1MB.每 1000MB为1GB,这二者进制上的差异造成了硬盘容量“缩水”。   因此,市面上购得的硬盘的实际容量与标称有所出入就不足为奇了。   将1000/1024的三次方设为常数e,使用常数e便可较容易地计算出每个硬盘的大致实际容量。e=0.931322574615478515625,保留两位小数,则e=O.93。那么你250GB的硬盘实际容量约为250x0.93=232.5GB。   cg是什么意思,游戏cg是什么意思?(一)   CG为Computer Graphics(电脑图形)的英文缩写,现在常用中文名称为“西橘”,核心意思为数码图形。随着时代发展,CG西橘的含义有所拓展,但是依然没有超出这个核心意思。   cg是什么意思?   CG是Computer Graphics的简称,直译就是电脑图像的意思。懒人对CG的理解就是使用电脑参与美术作品的创作,无论是完全使用电脑完成制作的,还是后期使用电脑加工处理的,都属于CG作品。   游戏cg是什么意思?   计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。随着以计算机为主要工具进行视觉设计和生产的一系列相关产业的形成,国际上习惯将利用计算机技术进行视觉设计和生产的领域通称为CG。   CG西橘通常指的是数码化的作品,一般服务于以下几种行业:广告、影视、动画、漫画和游戏业。内容是纯艺术创作到广告设计,可以是二维、三维、静止或动画。随着以计算机为主要工具进行视觉设计和生产的一系列相关产业的形成。现在CG西橘的概念正随着应用领域的拓展在不断扩大。如今的CG西橘一词,既包括技术也包括艺术,几乎囊括了当今电脑时代中所有的视觉艺术创作活动,如平面印刷品的设计、网页设计、三维动画、影视特效、多媒体技术、以计算机辅助设计为主的建筑设计及工业造型设计等。国际上习惯将利用计算机技术进行视觉设计和生产的领域通称为CG西橘——由CG西橘和虚拟真实技术制作的媒体文化,都可以归于CG西橘范畴。CG西橘行业已经形成一个以技术为基础的可观的视觉艺术创意型经济产业。   中国的CG西橘发展状况与日本有相似之处,但更多的是有着自身的特点:   中国的CG西橘发展最早可以追溯到二十世纪80年代末期,在清华大学、浙江大学等国家重点大学中的计算机研究所中开始了对计算机图形技术的研究,产生了像鹏群生教授(现任浙江大学国家CG西橘技术研究室主任)这样的计算机图形技术专家,他们对中国在计算机图形技术算法方面作出了巨大的贡献。但是当时由于经济发展以及对外开放程度的原因,绝大多数的学校及个人都没有机会接触到CG西橘,这个时期是中国计算机图形的萌芽阶段。   真正CG西橘在中国开始发展的阶段大约是在1994年左右直到现在,随着经济水平的提高以及开放程度的日益拓展,一部分中国人已经开始拥有电脑。更重要的是国外优秀的电脑游戏以及好莱坞电影的进入,使得国人开始对CG西橘有了一个感性的认识。而电脑游戏则更是激发了年轻一代的计算机从业人员投身于CG西橘行业的"热情,越来越多的人开始开发国内的电脑游戏市场,这是如今中国CG西橘行业和电脑游戏密切相关的现状的历史渊源。   <二>从业人员:   >就目前而言,CG西橘的从业人员主要集中在原先的计算机专业和美术专业人员上,他们有着相对成熟的技术和艺术创作经验,是中国CG西橘行业的先锋。全国CG西橘行业专业从业人员总数不超过10万。   <三>CG西橘应用领域:   主要集中在影视制作、电脑游戏制作、建筑效果图制作、广告设计以及个人艺术创作五个方面。   影视制作:   国内将CG西橘运用于影视制作的公司主要有上海电影制片厂、上海美术电影制片厂、北京紫禁城电影制作公司等几个较有实力的影视制作公司,另外还有北京DBS(深蓝的海)数码影视制作公司等专业数码影视制作公司也从事电影、电视中电脑特技镜头的制作。   电脑游戏软件:   这一领域的代表公司是台湾大宇公司、北京新天地、晶合,上海育碧、深圳金智塔、珠海金山公司的下属西山   居游戏制作室等。这些企业目前在中国CG西橘制作中处于龙头地位,代表了中国CG西橘行业的领先水平。虽然与国外的水平还有相当的差距,但是发展速度相当快。   建筑效果图:   广告行业也是目前促进中国CG西橘发展的行业之一,有相当一部分CG西橘艺术家都是从事这一领域的工作。代表公司是北京的水晶石公司,它在上海、广州开设有分公司。   Demo是什么意思啊?   Demo是什么意思啊?【电脑含义解释】   DEMO是demonstration的缩写,在电脑上的DEMO简单的说就是展示电脑图形与音乐的程式,所以游戏开始的动画展示也是DEMO的一 种。在电脑公司,可以看到电脑上展示介绍电脑软硬件的程式,这些属于商业性质的DEMO;这些DEMO是凭借图形与音乐来吸引顾客,达到宣传的目的。   软件中的“DEMO”   在软件版本中,DEMO即为演示版,这样的一般分两种,一种是功能齐全但有时间限制,大多为30天,30天过后就会要求你通过购买才能继续使用;另一种是在正式版出来前提供的体验版,这种版本没有时间限制,但大多功能不完整,最常见的就是游戏DEMO。   游戏中的“DEMO   在游戏正式版发售之前,官方为了进行宣传和压力测试,而放出的不完全版本,通常称为“试玩版”。通常试玩版游戏容量比较小,而且能让用户事先体验到游戏的内容,从而让用户更好的做出决定。
2023-06-28 01:58:361

效用函数为u=q的零点8次方加5mq为消费量m为收入,求消费者的需求函数

2023-06-28 01:58:421

求wince 下用opengl es 画一个三角形的代码

  下面是绘制的函数  void Render()  {  static int rotation=0;  GLshort vertexArray[9]={-25,-25,0, 25,-25,0, 0,25,0 };  GLubyte colorArray[12]={255,0,0,0, 0,255,0,0, 0,0,255,0 };  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  glLoadIdentity();  glTranslatex(0,0,FixedFromInt(-10));  glRotatex(FixedFromInt(rotation++),0,ONE,0);  glEnableClientState(GL_VERTEX_ARRAY);  glVertexPointer(3,GL_SHORT,0,vertexArray);  glEnableClientState(GL_COLOR_ARRAY);  glColorPointer(4,GL_UNSIGNED_BYTE,0,colorArray);  glDrawArrays(GL_TRIANGLES,0,3);  glDisableClientState(GL_VERTEX_ARRAY);  glDisableClientState(GL_COLOR_ARRAY);  eglSwapBuffers(glesDisplay,glesSurface);  }  其中vertexArray指定3个顶点的坐标值,  glVertexPointer(3,GL_SHORT,0,vertexArray);完成三角形的绘制  另外完整源代码如下:  // hello.cpp : 定义应用程序的入口点。  //  #include "stdafx.h"  #include "hello.h"  #include <windows.h>  #include <commctrl.h>  #include <GLES/gl.h>  #include <GLES/egl.h>  #define MAX_LOADSTRING 100  #define PRECISION 16  #define ONE (1<<PRECISION)  #define ZERO 0  inline GLfixed FixedFromInt(int value){ return value<<PRECISION; }  bool InitOGLES();  void Render();  void Clean();  // 全局变量:  HINSTANCE g_hInst; // 当前实例  HWND g_hWndMenuBar; // 菜单栏句柄  HWND hWnd;  HDC hDc;  EGLDisplay glesDisplay;  EGLSurface glesSurface;  EGLContext glesContext;  TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本  TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名  // 此代码模块中包含的函数的前向声明:  ATOM MyRegisterClass(HINSTANCE, LPTSTR);  BOOL InitInstance(HINSTANCE, int);  LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);  INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);  int WINAPI WinMain(HINSTANCE hInstance,  HINSTANCE hPrevInstance,  LPTSTR lpCmdLine,  int nCmdShow)  {  MSG msg;  // 执行应用程序初始化:  if (!InitInstance(hInstance, nCmdShow))  {  return FALSE;  }  HACCEL hAccelTable;  hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_HELLO));  /* 主消息循环:  while (GetMessage(&msg, NULL, 0, 0))  {  if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))  {  TranslateMessage(&msg);  DispatchMessage(&msg);  }  }*/  bool done=false;  while(!done)  {  if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))  {  if(msg.message==WM_QUIT)  {  done=true;  }  else  {  TranslateMessage(&msg);  DispatchMessage(&msg);  }  }  else  {  Render();  }  }  Clean();  return (int) msg.wParam;  }  //  // 函数: MyRegisterClass()  //  // 目的: 注册窗口类。  //  // 注释:  //  ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)  {  WNDCLASS wc;  wc.style = CS_HREDRAW | CS_VREDRAW;  wc.lpfnWndProc = WndProc;  wc.cbClsExtra = 0;  wc.cbWndExtra = 0;  wc.hInstance = hInstance;  wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_HELLO));  wc.hCursor = 0;  wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);  wc.lpszMenuName = 0;  wc.lpszClassName = szWindowClass;  return RegisterClass(&wc);  }  //  // 函数: InitInstance(HINSTANCE, int)  //  // 目的: 保存实例句柄并创建主窗口  //  // 注释:  //  // 在此函数中,我们在全局变量中保存实例句柄并  // 创建和显示主程序窗口。  //  BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)  {  g_hInst = hInstance; // 将实例句柄存储在全局变量中  // 在应用程序初始化期间,应调用一次 SHInitExtraControls 以初始化  // 所有设备特定控件,例如,CAPEDIT 和 SIPPREF。  SHInitExtraControls();  LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);  LoadString(hInstance, IDC_HELLO, szWindowClass, MAX_LOADSTRING);  //如果它已经在运行,则将焦点置于窗口上,然后退出  hWnd = FindWindow(szWindowClass, szTitle);  if (hWnd)  {  // 将焦点置于最前面的子窗口  // “| 0x00000001”用于将所有附属窗口置于前台并  // 激活这些窗口。  SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));  return 0;  }  if (!MyRegisterClass(hInstance, szWindowClass))  {  return FALSE;  }  hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);  if (!hWnd)  {  return FALSE;  }  if(!InitOGLES())  return false;  // 使用 CW_USEDEFAULT 创建主窗口时,将不会考虑菜单栏的高度(如果创建了一个  // 菜单栏)。因此,我们要在创建窗口后调整其大小  // 如果菜单栏存在  if (g_hWndMenuBar)  {  RECT rc;  RECT rcMenuBar;  GetWindowRect(hWnd, &rc);  GetWindowRect(g_hWndMenuBar, &rcMenuBar);  rc.bottom -= (rcMenuBar.bottom - rcMenuBar.top);  MoveWindow(hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, FALSE);  }  ShowWindow(hWnd, nCmdShow);  UpdateWindow(hWnd);  return TRUE;  }  //  // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)  //  // 目的: 处理主窗口的消息。  //  // WM_COMMAND - 处理应用程序菜单  // WM_PAINT - 绘制主窗口  // WM_DESTROY - 发送退出消息并返回  //  //  LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  {  int wmId, wmEvent;  PAINTSTRUCT ps;  HDC hdc;  static SHACTIVATEINFO s_sai;  switch (message)  {  case WM_COMMAND:  wmId = LOWORD(wParam);  wmEvent = HIWORD(wParam);  // 分析菜单选择:  switch (wmId)  {  case IDM_HELP_ABOUT:  DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);  break;  case IDM_OK:  SendMessage (hWnd, WM_CLOSE, 0, 0);  break;  default:  return DefWindowProc(hWnd, message, wParam, lParam);  }  break;  case WM_CREATE:  SHMENUBARINFO mbi;  memset(&mbi, 0, sizeof(SHMENUBARINFO));  mbi.cbSize = sizeof(SHMENUBARINFO);  mbi.hwndParent = hWnd;  mbi.nToolBarId = IDR_MENU;  mbi.hInstRes = g_hInst;  if (!SHCreateMenuBar(&mbi))  {  g_hWndMenuBar = NULL;  }  else  {  g_hWndMenuBar = mbi.hwndMB;  }  // 初始化外壳程序激活信息结构  memset(&s_sai, 0, sizeof (s_sai));  s_sai.cbSize = sizeof (s_sai);  break;  case WM_PAINT:  ValidateRect(hWnd,NULL);  break;  case WM_DESTROY:  CommandBar_Destroy(g_hWndMenuBar);  PostQuitMessage(0);  break;  case WM_ACTIVATE:  // 向外壳程序通知我们的激活消息  SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE);  break;  case WM_SETTINGCHANGE:  SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai);  break;  default:  return DefWindowProc(hWnd, message, wParam, lParam);  }  return 0;  }  // “关于”框的消息处理程序。  INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)  {  switch (message)  {  case WM_INITDIALOG:  {  // 创建一个“完成”按钮并调整其大小。  SHINITDLGINFO shidi;  shidi.dwMask = SHIDIM_FLAGS;  shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN | SHIDIF_EMPTYMENU;  shidi.hDlg = hDlg;  SHInitDialog(&shidi);  }  return (INT_PTR)TRUE;  case WM_COMMAND:  if (LOWORD(wParam) == IDOK)  {  EndDialog(hDlg, LOWORD(wParam));  return TRUE;  }  break;  case WM_CLOSE:  EndDialog(hDlg, message);  return TRUE;  }  return (INT_PTR)FALSE;  }  bool InitOGLES()  {  EGLConfig configs[10];  EGLint matchingConfigs;  const EGLint configAttribs[]={  EGL_RED_SIZE, 8,  EGL_GREEN_SIZE, 8,  EGL_BLUE_SIZE, 8,  EGL_ALPHA_SIZE, EGL_DONT_CARE,  EGL_DEPTH_SIZE, 16,  EGL_STENCIL_SIZE,EGL_DONT_CARE,  EGL_SURFACE_TYPE,EGL_WINDOW_BIT,  EGL_NONE, EGL_NONE  };  hDc=GetWindowDC(hWnd);  glesDisplay=eglGetDisplay(hDc);  if(!eglInitialize(glesDisplay,NULL,NULL))  return false;  if(!eglChooseConfig(glesDisplay,configAttribs,&configs[0],10,&matchingConfigs))  return false;  if(matchingConfigs<1)  return false;  glesSurface=eglCreateWindowSurface(glesDisplay,configs[0],hWnd,configAttribs);  if(!glesSurface)  return false;  glesContext=eglCreateContext(glesDisplay,configs[0],0,configAttribs);  if(!glesContext)  return false;  eglMakeCurrent(glesDisplay,glesSurface,glesSurface,glesContext);  glClearColorx(0,0,0,0);  glShadeModel(GL_SMOOTH);  RECT r;  GetWindowRect(hWnd,&r);  glViewport(r.left,r.top,r.right-r.left,r.bottom-r.top);  glMatrixMode(GL_PROJECTION);  glLoadIdentity();  glOrthox(FixedFromInt(-50),FixedFromInt(50),  FixedFromInt(-50),FixedFromInt(50),  FixedFromInt(-50),FixedFromInt(50));  glMatrixMode(GL_MODELVIEW);  glLoadIdentity();  return true;  }  void Render()  {  static int rotation=0;  GLshort vertexArray[9]={-25,-25,0, 25,-25,0, 0,25,0 };  GLubyte colorArray[12]={255,0,0,0, 0,255,0,0, 0,0,255,0 };  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  glLoadIdentity();  glTranslatex(0,0,FixedFromInt(-10));  glRotatex(FixedFromInt(rotation++),0,ONE,0);  glEnableClientState(GL_VERTEX_ARRAY);  glVertexPointer(3,GL_SHORT,0,vertexArray);  glEnableClientState(GL_COLOR_ARRAY);  glColorPointer(4,GL_UNSIGNED_BYTE,0,colorArray);  glDrawArrays(GL_TRIANGLES,0,3);  glDisableClientState(GL_VERTEX_ARRAY);  glDisableClientState(GL_COLOR_ARRAY);  eglSwapBuffers(glesDisplay,glesSurface);  }  void Clean()  {  if(glesDisplay)  {  eglMakeCurrent(glesDisplay,NULL,NULL,NULL);  if(glesContext)  eglDestroyContext(glesDisplay,glesContext);  if(glesSurface)  eglDestroySurface(glesDisplay,glesSurface);  eglTerminate(glesDisplay);  }  DestroyWindow(hWnd);  UnregisterClass(szWindowClass,g_hInst);  }
2023-06-28 01:58:491

解读每一段代码的 含义

// calc.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "calc.h" #define MAX_LOADSTRING 100 // 全局变量: HINSTANCE hInst; // 当前实例 TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本 TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 // 此代码模块中包含的函数的前向声明: ATOM MyRegisterClass(HINSTANCE hInstance); // 注册窗口函数的声明BOOL InitInstance(HINSTANCE, int); // 初始化实例的函数声明LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // 主窗口的回调函数INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); // "关于"对话框的回调函数int APIENTRY _tWinMain(HINSTANCE hInstance, // win32程序入口函数HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: 在此放置代码。 MSG msg; // 定义消息结构体对象HACCEL hAccelTable; // 定义对象// 初始化全局字符串 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); // 导入字符串资源LoadString(hInstance, IDC_CALC, szWindowClass, MAX_LOADSTRING); // 同上一句MyRegisterClass(hInstance); // 调用注册窗口函数// 执行应用程序初始化: if (!InitInstance (hInstance, nCmdShow)) //调用初始化实例函数{ return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CALC)); // 导入// 主消息循环: while (GetMessage(&msg, NULL, 0, 0)) // 从消息队列中取消息{ if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); // 传递消息DispatchMessage(&msg); } } return (int) msg.wParam; } ATOM MyRegisterClass(HINSTANCE hInstance) // 注册窗口函数,实际调用的api 是 RegisterClassEx{ WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CALC)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_CALC); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } // // 函数: InitInstance(HINSTANCE, int) // // 目的: 保存实例句柄并创建主窗口 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) // 初始化实例函数,此函数功能是创建并显示窗口,实际使用的api 是CreateWindow,,ShowWindow{ HWND hWnd; hInst = hInstance; // 将实例句柄存储在全局变量中 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; }这是一个基本的win32程序的框架
2023-06-28 01:58:571

求c语言在vc环境下编程的界面实例

这只是核心代码,实现把一个图片分成9快打乱拼图功能里面有不少系统自动生成的代码看你会不会用了假设你已经会创建Windows项目,我就不多说了如果要成功运行你需要准备一个bmp文件,改名为00.bmp和这个文件放同目录如果你还不能成功运行我只能把整个项目打包给你了o(>﹏<)o如有疑问,email到30172490@qq.com但不保证能及时回复//拼图.cpp:定义应用程序的入口点。//#include"stdafx.h"#include"拼图.h"#include"time.h"#defineMAX_LOADSTRING100//全局变量:HINSTANCEhInst;//当前实例TCHARszTitle[MAX_LOADSTRING];//标题栏文本TCHARszWindowClass[MAX_LOADSTRING];//主窗口类名intbmp[3][3]={0};HDChdcBmp;POINTold={-1,-1};intnum[9]={9,8,7,6,5,4,3,2,1};//此代码模块中包含的函数的前向声明:ATOMMyRegisterClass(HINSTANCEhInstance);BOOLInitInstance(HINSTANCE,int);LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);LRESULTCALLBACKAbout(HWND,UINT,WPARAM,LPARAM);intAPIENTRY_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow){//TODO:在此放置代码。MSGmsg;HACCELhAccelTable;//初始化全局字符串LoadString(hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING);LoadString(hInstance,IDC_MY,szWindowClass,MAX_LOADSTRING);MyRegisterClass(hInstance);//执行应用程序初始化:if(!InitInstance(hInstance,nCmdShow)){returnFALSE;}hAccelTable=LoadAccelerators(hInstance,(LPCTSTR)IDC_MY);//主消息循环:while(GetMessage(&msg,NULL,0,0)){if(!TranslateAccelerator(msg.hwnd,hAccelTable,&msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return(int)msg.wParam;}////函数:MyRegisterClass()////目的:注册窗口类。////注释:////仅当希望在已添加到Windows95的//“RegisterClassEx”函数之前此代码与Win32系统兼容时,//才需要此函数及其用法。调用此函数//十分重要,这样应用程序就可以获得关联的//“格式正确的”小图标。//ATOMMyRegisterClass(HINSTANCEhInstance){WNDCLASSEXwcex;wcex.cbSize=sizeof(WNDCLASSEX);wcex.style=CS_HREDRAW|CS_VREDRAW;wcex.lpfnWndProc=(WNDPROC)WndProc;wcex.cbClsExtra=0;wcex.cbWndExtra=0;wcex.hInstance=hInstance;wcex.hIcon=LoadIcon(hInstance,(LPCTSTR)IDI_MY);wcex.hCursor=LoadCursor(NULL,IDC_ARROW);wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName=(LPCTSTR)IDC_MY;wcex.lpszClassName=szWindowClass;wcex.hIconSm=LoadIcon(wcex.hInstance,(LPCTSTR)IDI_SMALL);returnRegisterClassEx(&wcex);}////函数:InitInstance(HANDLE,int)////目的:保存实例句柄并创建主窗口////注释:////在此函数中,我们在全局变量中保存实例句柄并//创建和显示主程序窗口。//BOOLInitInstance(HINSTANCEhInstance,intnCmdShow){HWNDhWnd;hInst=hInstance;//将实例句柄存储在全局变量中hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);if(!hWnd){returnFALSE;}ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);returnTRUE;}voidLoadingImage(HDChdc){HBITMAPhBmp=(HBITMAP)LoadImage(NULL,"00.bmp",IMAGE_BITMAP,300,300,LR_LOADFROMFILE);hdcBmp=CreateCompatibleDC(hdc);DeleteObject(SelectObject(hdcBmp,hBmp));}voidDrawBmp(HDChdc){for(inti=0;i<3;i++)for(intj=0;j<3;j++)BitBlt(hdc,i*100,j*100,100,100,hdcBmp,(bmp[j][i]-1)%3*100,(bmp[j][i]-1)/3*100,SRCCOPY);}voidrandom(){inti,j;srand((unsigned)time(NULL));for(i=0;i<3;i++)for(j=0;j<3;j++)while(true){intt=rand()%9;if(num[t]){bmp[j][i]=num[t];num[t]=0;break;}}}////函数:WndProc(HWND,unsigned,WORD,LONG)////目的:处理主窗口的消息。////WM_COMMAND-处理应用程序菜单//WM_PAINT-绘制主窗口//WM_DESTROY-发送退出消息并返回////LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){intwmId,wmEvent,i,j,x,y,t;PAINTSTRUCTps;HDChdc;//HBITMAPhBmp;switch(message){caseWM_CREATE:random();hdc=GetDC(hWnd);LoadingImage(hdc);ReleaseDC(hWnd,hdc);break;caseWM_LBUTTONDOWN:x=LOWORD(lParam)/100;y=HIWORD(lParam)/100;if(old.x==-1){old.x=y;old.y=x;}else{t=bmp[old.x][old.y];bmp[old.x][old.y]=bmp[y][x];bmp[y][x]=t;old.x=-1;old.y=-1;}hdc=GetDC(hWnd);DrawBmp(hdc);ReleaseDC(hWnd,hdc);break;caseWM_COMMAND:wmId=LOWORD(wParam);wmEvent=HIWORD(wParam);//分析菜单选择:switch(wmId){caseIDM_ABOUT:DialogBox(hInst,(LPCTSTR)IDD_ABOUTBOX,hWnd,(DLGPROC)About);break;caseIDM_EXIT:DestroyWindow(hWnd);break;default:returnDefWindowProc(hWnd,message,wParam,lParam);}break;caseWM_PAINT:hdc=BeginPaint(hWnd,&ps);//TODO:在此添加任意绘图代码...DrawBmp(hdc);EndPaint(hWnd,&ps);break;caseWM_DESTROY:PostQuitMessage(0);break;default:returnDefWindowProc(hWnd,message,wParam,lParam);}return0;}//“关于”框的消息处理程序。LRESULTCALLBACKAbout(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){caseWM_INITDIALOG:returnTRUE;caseWM_COMMAND:if(LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL){EndDialog(hDlg,LOWORD(wParam));returnTRUE;}break;}returnFALSE;}
2023-06-28 01:59:041

用opengl画下图中的三角形

OpenGL三维图形标准是由AT&T公司UNIX软件实验室、IBM 、DEC、SUN、HP、Microsoft和SGI等多家公司在GL图形库标准的基础 上联合推出的开放式图形库,它使在微机上实现三维真实 感图形的生成与显示成为可能。由于OpenGL是开放的图形标 准,用户原先在UNIX下开发的OpenGL图形软件很容易移植到微 机上的WindowsNT/95上。笔者在VisualC++4.1(以下简称VC)集 成环境下,开发了基于OpenGL的三维真实感图形应用程序,现 介绍如下。 微机上的OpenGL开发环境 基于OpenGL标准开发的应用程序必须运行于32位Windows 平台下,如WindowsNT或Windows95环境;而且运行时还需有动态 链接库OpenGL32.DLL、Glu32.DLL,这两个文件在安装WindowsNT时已 自动装载到C:WINNTSYSTEM32目录下(这里假定用户将WindowsNT 安装在C盘上);而对于使用Windows95平台的用户,则需手工将 两个动态库复制到Windows95目录的SYSTEM子目录中。安装了 WindowsNT/95和VC4.1后,用户就具备了基于OpenGL开发三维图 形软件的基本条件。 OpenGL程序设计的基本步骤 1.OpenGL在WindowsNT下的运行机制 OpenGL工作在客户机/服务器模式下,当客户方(即基 于OpenGL标准开发的应用程序)向服务器(OpenGL核心机制)发出 命令时,由服务器负责解释这些命令。通常情况下,客户方 和服务器是运行在同一台微机上的。由于OpenGL的运行机制 是客户机/服务器模式,这使得用户能够十分方便地在网 络环境下使用OpenGL,OpenGL在WindowsNT上的这种实现方式通常 称为网络透明性。 OpenGL的图形库函数封装在动态链接库OpenGL32.DLL中, 客户机中的所有OpenGL函数调用,都被传送到服务器上,由 WinSrv.DLL实现功能,再将经过处理的指令发送到Win32设备驱 动接口(DDI),从而实现在计算机屏幕上产生图像。 若使用OpenGL图形加速卡,则上述机制中将添加两个 驱动器:OpenGL可装载客户模块(OpenGLICD)将安装在客户端;硬 件指定DDI将安装在服务器端,与WinDDI同一级别。 2.OpenGL的库函数 开发基于OpenGL的应用程序,必须先了解OpenGL的库函 数。OpenGL函数命令方式十分有规律,每个库函数均有前缀gl 、glu、aux,分别表示该函数属于OpenGL基本库、实用库或辅助 库。WindowsNT下的OpenGL包含了100多个核心函数,均以gl作为前 缀,同时还支持另外四类函数: OpenGL实用库函数:43个,以glu作为前缀; OpenGL辅助库函数:31个,以aux作为前缀; Windows专用库函数(WGL):6个,以wgl作为前缀; Win32API函数(WGL):5个,无前缀。 OpenGL的115个核心函数提供了最基本的功能,可以实 现三维建模、建立光照模型、反走样、纹理映射等;OpenGL实 用库函数在核心函数的上一层,这类函数提供了简单的调 用方法,其实质是调用核心函数,目的是减轻开发者的编程 工作量;OpenGL辅助库函数是一些特殊的函数,可以供初学者 熟悉OpenGL的编程机制,然而使用辅助库函数的应用程序只 能在Win32环境中使用,可移植性较差,所以开发者应尽量避 免使用辅助库函数;Windows专用库函数(WGL)主要针对WindowsNT /95环境的OpenGL函数调用;Win32API函数用于处理像素存储格 式、双缓存等函数调用。 3.VC环境下基于OpenGL的编程步骤 下面介绍在VC环境中建立基于Opeetting菜单选项,在Link栏的Lib输入域中 添加openg132.lib、glu32.lib,若需使用OpenGL的辅助库函数,则还 需添加glaux.lib。 (3)选择View/ClassWizard菜单选项,打开MFC对话框,在 ClassName栏中选择CMyTestView类,进行以下操作: 选择WM_CREATE消息,鼠标单击EditCode,将OpenGL初始化代码 添加到OnCreate()函数中: /*定义像素存储格式*/ PIXELFORMATDESCRIPTORpfd= { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL, PFD_TYPE_RGBA, 24, 0,0,0,0,0,0, 0,0,0,0,0,0,0 32, 0,0, PFD_MAIN_PLANE, 0, 0,0,0, } CCLientdc(this); intpixelFormat=ChoosePixelFormat(dc.m_hDC,&pfd); BOOLsuccess=SetPixelFormat(dc.m_hDC,pixelFormat,&pfd); m_hRC=wglCreateContext(dc.m_hDC); 选择WM_DESTORY消息,在OnDestory()中添加以下代码: wglDeleteContext(m_hRC); 在MyTestView.cpp中,将以下代码添加到PreCreateWindows()函数中: cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS; OpenGL只对WS_CLIPCHILDREN|WS_CLIPSIBLINGS类型窗口有效; 在MyTestView.cpp中,将以下代码添加到OnDraw()函数中: wglMakeCurrent(pDC->m_hDC,m_hRC); DrawScene();//用户自定义函数,用于绘制三维场景; wglMakeCurrent(pDC->m_hDC,NULL); 在MyTestView.cpp中,添加成员函数DrawScene(): voidCMyTestView::DrawScene() {/*绘制三维场景*/} (4)在MyTestView.h中包含以下头文件并添加类成员说明: #include #include #include 在CTestView类中的protected:段中添加成员变量声明: HGLRCm_hRC; 同时添加成员函数声明: DrawScene(); 这样,一个基于OpenGL标准的程序框架已经构造好,用 户只需在DrawScene()函数中添加程序代码即可。 建立三维实体模型 三维实体建模是整个图形学的基础,要生成高逼真 度的图像,首先要生成高质量的三维实体模型。 OpenGL中提供了十几个生成三维实体模型的辅助库函 数,这些函数均以aux作为函数名的前缀。简单的模型,如球 体、立方体、圆柱等可以使用这些辅助函数来实现,如 auxWireSphere(GLdoubleradius)(绘制一半径为radius的网状球体)。 但是这些函数难以满足建立复杂三维实体的需要,所以用 户可以通过其它建模工具(如3DS等)来辅助建立三维实体模 型数据库。笔者在三维实体的建模过程中采用3DS提供的2D Shape、3DLofter和3DEditor进行模型的编辑,最后通过将模型数 据以DXF文件格式输出存储供应用程序使用。 真实感图形的绘制 1.定义光照模型和材质 (1)光源。OpenGL提供了一系列建立光照模型的库函 数,使用户可以十分方便地在三维场景中建立所需的光照 模型。OpenGL中的光照模型由环境光(AmbientLight)、漫射光 (DiffuseLight)、镜面反射光(SpecularLight)等组成,同时还可设 置光线衰减因子来模拟真实的光源效果。 例如,定义一个黄色光源如下: GlfloatLight_position[]={1.0,1.0,1.0,0.0,}; GlfloatLight_diffuse[]={1.0,1.0,0.0,1.0,}; glLightfv(GL_LIGHT0,GL_POSTTION,light_position);//定义光源位置 glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);//定义光源漫射光 光源必须经过启动后才会影响三维场景中的实体,可以通过以下指令使光源有效:< glEnable(LIGHTING);//启动光照模型; glEnable(GL_LIGHT0);//使光源GL_LIGHT0有效; OpenGL中一共可以定义GL_LIGHT0~GL_LIGHT7八个光源。 (2)材质。OpenGL中的材质是指构成三维实体的材料在 光照模型中对于红、绿、蓝三原色的反射率。与光源的定义 类似,材质的定义分为环境、漫射、镜面反射成分,另外还 有镜面高光指数、辐射成分等。通过对三维实体的材质定义 可以大大提高应用程序所绘制的三维场景的逼真程度。例 如: /*设置材质的反射成分*/ GLfloatmat_ambient[]={0.8,0.8,0.8,1.0}; GLfloatmat_diffuse[]={0.8,0.0,0.8,1.0};/*紫色*/ GLfloatmat_specular[]={1.0,0.0,1.0,1.0};/*镜面高光亮紫色*/ GLfloatmat_shiness[]={100.0};/*高光指数*/ glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);/*定义环境光反射率*/ glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);/*定义漫射光反射率*/ glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);/*定义镜面光反射率*/ glMaterialfv(GL_FRONT,GL_SHINESS,mat_shiness);/*定义高光指数*/ (3)材质RGB值与光源RGB值的关系。OpenGL中材质的颜色 与光照模型中光源的颜色含义略有不同。对于光源,R、G、B 值表示三原色在光源中所占有的比率;而对于材质定义,R、 G、B的值表示具有这种材质属性的物体对于三原色的反射 比率,场景中物体所呈现的颜色与光照模型、材质定义都相 关。例如,若定义的光源颜色是(Lr,Lg,Lb)=(1.0,1.0,1.0)(白光), 物体的材质颜色定义为(Mr,Mg,Mb)=(0.0,0.0,0.8),则最终到达人 眼的物体颜色应当是(Lr*Mr,Lg*Mg,Lb*Mb)=(0.0,0.0,0.8)(蓝色)。 2.读取三维模型数据 为了绘制三维实体,我们首先必须将预先生成的三 维实体模型从三维实体模型库中读出。下图描述了读取三 维实体模型的流程。 3.三维实体绘制 由于3DS的DXF文件中对于三维实体的描述是采用三角 形面片逼近的方法,而在OpenGL函数库中,提供了绘制三角形 面片的方法,所以为三维实体的绘制提供了方便。以下提供 了绘制三角形面片的方法: glBegin(TRANGLES);//定义三角形绘制开始 glVertexf((GLfloat)x1,(GLfloat)y1,(GLfloat)z1);//第一个顶点 glVertexf((GLfloat)x2,(GLfloat)y2,(GLfloat)z2);//第二个顶点 glVertexf((GLfloat)x3,(GLfloat)y3,(GLfloat)z3);//第三个顶点 glEnd();//绘制结束 为了提高三维实时动画的显示速度,我们利用了 OpenGL库中的显示列表(DisplayList)的功能,将三维场景中的实 体分别定义为单独的显示列表,预先生成三维实体。在图形 显示时,只需调用所需的显示列表即可显示相应的三维实 体,而不需要重新计算实体在场景中的坐标,避免了大量的 浮点运算。在调用显示列表前所作的旋转、平移、光照、材 质的设定都将影响显示列表中的三维实体的显示效果。具 体实现算法如下: for(ObjectNo=0;ObjectNo<实体个数;ObjectNo++) { glNewList(ObjectNo,GL_COMPILE);//创建第ObjectNo个实体的显示列表 for(Fac
2023-06-28 01:59:121

几个关于VC++的问题,都仔细回答重重有赏

VS2012的话,选择W32应用程序就可以了,与VB差不多,你现在选用的是 控制台 应用程序
2023-06-28 01:59:274

VS2012 实现接口快捷键

shift+alt+f10
2023-06-28 01:59:341

dialog 与dialogex区别

没有dialogex的说法,只有dialog的说法,在电脑里,dialog的意思是对话框。Windows 7具有非常友好的用户交互界面,对话框是专门为人机交互而设计的小型窗口,是运用程序操纵电脑的另一种必须掌握的手段。它的大小是不可调节的。对话框一般包含了丰富的选项供用户选择,有些对话框还可以包括几个选项卡,每个选项卡提供一组选项。此外,对话框中还有文本框、单选框、复选框、列表框、组合框、数字框、按钮等。文本框是一长条窗口,单击文本框,出现文字光标闪烁,可以输入文字。单选框内有几个单选项,只能选择其中一个,前面的圆圈内显示出一个圆点,选中任意一项后同一框里的其它项就自动失选。复选框内有几个复选项,可同时选中几项,方框中打对号,表示选中。列表框右边有一个下拉按钮,单击这个按钮可以列出几条内容,供用户选择。组合框是既可以输入文字同时也能从列表中选择的一种输入框。数字框右边有两个小按钮,分别用以增大或减小框内数字。在一个对话框里总要有几个按钮,每个突出的矩形区域就是一个按钮,一般有确定和取消两个按钮。
2023-06-28 01:59:545

在VC2010,关于win32项目程序开始创建时的问题

这个刚开始没必要每句都懂,只要知道每个函数有什么作用就行了,如果你以后继续深入win32就会理解的.注释见楼上你如果学win32,首先一定要知道一个项目有那几部分组成....
2023-06-28 02:00:092

怎么才能将hge窗口作为子窗口显示在sdk窗口中

2023-06-28 02:00:221

求VC++显示一个窗体的最简代码。

2023-06-28 02:00:315

谁有D3D示例程序代码?(带说明的)

D3D程序都是用VC++开发的,你会C++的话很容易就能看懂。我刚开始学也看不懂,后来干脆先放下来不学了,把VC++给彻底学了一遍,再看原来那些代码发现简单的要死。
2023-06-28 02:00:483

~~~~窗口代码加入程序~~~

2023-06-28 02:00:561

Windows编程的标识符问题。

打开 resources.h 头文件 看看,呵呵,在 资源视图 里面查看 属性
2023-06-28 02:01:032

怎么样在对话框中显示网页并屏蔽IE的弹出式菜单

以下是代码执行:在对话框中显示网页并不是个新鲜的话题,但要将IE的那个讨的厌的弹出式菜单去掉,可不是件容易的事,可能很多的程序员都作过尝试,显然地,捕获WM_RBUTTONDOWN,WM_RBUTTONUP,WM_CONTEXTMENU,消息以及重载PreTranslateMessage等方法,都不能取得很好的结果。 这一切都与IE的扩展接口IDocHostUIHandler有关,在此并不想对此接口作详细讲述,只针此我们的需求--去掉弹出式菜单,用一个例子作为注解。 第一、实现CHtmlCtrl。 CHtmlCtrl这个类是对话框中使用CHtmlView显示网页的必备。其实很简单,只要注意以下几点就行: 1.从CHtmlView派生。 2.构造函数必需public,因为CHtmlView的构造函数是protect的。 3.捕获WM_MOUSEACTIVATE消息,如下: int CHtmlCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message) { return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message); ^^^^ 注意:不是CHtmlView } 4.重载PostNcDestroy,并且什么也不做。 OK,没问题了,你现在可以在对话框中声明CHtmlCtrl变量,并且Create,Navigate,现在网页显示出来了,下一步。 第二、写一个奇怪的,有点像COM类对象的一个C++类(CMyUi)。 #include <mshtmhst.h> class CMyUi:public IDocHostUIHandler { public: BOOL m_vbEnableCtxMenus; CMyUi():m_vbEnableCtxMenus(FALSE){}// FALSE 表示不显示弹出式菜单 virtual ~CMyUi(){}STDMETHOD(ShowContextMenu)(DWORD dwID, POINT FAR* ppt, IUnknown FAR* pcmdtReserved, IDispatch FAR* pdispReserved) { if (m_vbEnableCtxMenus == TRUE) // Show Context Menu return S_FALSE; else return S_OK; }STDMETHOD(GetHostInfo)(DOCHOSTUIINFO FAR *pInfo) { return E_NOTIMPL; }STDMETHOD(ShowUI)(DWORD dwID, IOleInPlaceActiveObject FAR* pActiveObject, IOleCommandTarget FAR* pCommandTarget, IOleInPlaceFrame FAR* pFrame, IOleInPlaceUIWindow FAR* pDoc) { return E_NOTIMPL; }STDMETHOD(HideUI)(void) { return E_NOTIMPL; }STDMETHOD(UpdateUI)(void) { return E_NOTIMPL; }STDMETHOD(EnableModeless)(BOOL fEnable) { return E_NOTIMPL; }STDMETHOD(OnDocWindowActivate)(BOOL fActivate) { return E_NOTIMPL; }STDMETHOD(OnFrameWindowActivate)(BOOL fActivate) { return E_NOTIMPL; }STDMETHOD(ResizeBorder)(LPCRECT prcBorder, IOleInPlaceUIWindow FAR* pUIWindow, BOOL fRameWindow) { return E_NOTIMPL; }STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, const GUID FAR* pguidCmdGroup, DWORD nCmdID) {return E_NOTIMPL; }STDMETHOD(GetOptionKeyPath)(LPOLESTR FAR* pchKey, DWORD dw) { return E_NOTIMPL; }STDMETHOD(GetDropTarget)(IDropTarget* pDropTarget, IDropTarget** ppDropTarget) { return E_NOTIMPL; }STDMETHOD(GetExternal)(IDispatch** ppDispatch) { return E_NOTIMPL; }STDMETHOD(TranslateUrl)(DWORD dwTranslate, OLECHAR* pchURLIn, OLECHAR** ppchURLOut) { return E_NOTIMPL; }STDMETHOD(FilterDataObject)(IDataObject* pDO, IDataObject** ppDORet) { return E_NOTIMPL; } STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObj){ if (iid == IID_IUnknown || iid == IID_IDocHostUIHandler) { *ppvObj = this; return S_OK; } return S_FALSE; }STDMETHODIMP_(ULONG) AddRef(){ return 1; }STDMETHODIMP_(ULONG) Release(){ return 1; }}; 这个类主要实现了一个IDocHostUIHandler,由于并不是一个真正的COM类对象,所以不用实现COM的其它内容。这一步的工作也很简单,不是吗?当然,要知道为什么,你得去看看MSDN上关于IDocHostUIHandler的内容。 第三、拼在一起。 1.在上面实现的CHtmlCtrl加入公有成员IDocHostUIHandler* m_ui。 2.在CHtmlCtrl的构造函数中加入 CMyUi* t = new CMyUi; t->QueryInterface(IID_IDocHostUIHandler, (void**)&m_ui); 3.重载OnNavigateComplete2,加入以下代码: { CHtmlView::OnNavigateComplete2(strURL);IDispatch* pDoc = GetHtmlDocument(); if (pDoc == NULL) { pDoc->Release(); return; } ICustomDoc* pDoc2=NULL; HRESULT hresult = pDoc->QueryInterface(IID_ICustomDoc, (void**)&pDoc2); if (FAILED(hresult)) { pDoc->Release(); return; } pDoc->Release(); pDoc2->SetUIHandler(m_ui); pDoc2->Release(); } 大功告成,要是不出什么意外的话。 要是有BUG,或是出不来网页,没太大问题,用你的智慧与一点时间解决它。
2023-06-28 02:01:101

菜单项上如何建立加速键

一种是直接与菜单项关联的加速键 另一种就是自定义的加速键. 第一种: 首先在资源文件Accelerator中添加快捷键资源 ID选择你要关联菜单项的名称 然后再设置你的快捷键.什么?下一步?在.h文件中加入一个 HACCEL hAccel;变量 然后在OnInitDialog或初始化中加入hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MENU_MAIN)); 后面的参数改成加速键的资源文件名.最后在PreTranslateMessage(MSG* pMsg) 中加入: if(::TranslateAccelerator(GetSafeHwnd(),hAccel,pMsg)) return true; 这样 以后只要在Accelerator资源文件中添加快捷键就可以了 注意: 添加快捷键的名字一定要与菜单名称一样 这样才能响应.现在只需要在此菜单项中加入OnCommand消息的处理就可以了.第二种: 还是在资源文件Accelerator中添加快捷键资源 ID自己定义一个.然后再设置你的快捷键.下一步...就是在.h文件中定义一个快捷键对象HACCEL m_hAccel;然后在.cpp文件中初始 m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));IDR_ACCELERATOR1为你的加速资源名称.注意不是刚刚定义的加速键ID.再添加PreTranslateMessage消息处理 在里面加入以下代码: //保存快捷键被启用 if(m_hAccel != NULL) { if (TranslateAccelerator(m_hWnd, m_hAccel, pMsg)) return TRUE; } 再添加OnCommand消息处理 加入以下代码://响应加速键 switch(LOWORD(wParam)) { case SHOW_DIAL0G: //加速键ID //...添加处理语句 break; case SHOW_DIALOG_02: //加速键ID //...添加处理语句 break; } ok!
2023-06-28 02:01:201

itranslate自动扣费怎么退款

移动扣费,绝不可取消!若是错扣费,你打10086投诉即可!拓展:TranslateAccelerator,函数功能:翻译加速键表。该函数处理菜单命令中的加速键。该函数将一个WM_KEYDOWN或WM_SYSKEYDOWN消息翻译成一个WM_COMMAND或WM_SYSCOMMAND消息(如果在给定的加速键表中有该键的入口),然后将WM_COMMAND或WM_SYSCOMMAND消息直接送到相应的窗口处理过程。
2023-06-28 02:01:271

为什么要使用加速键?,什么是键盘加速键

什么是键盘加速键?加速键是产生WM_COMMAND消息(有些情况下是WM_SYSCOMMAND)的键组合。许多时候,程序使用加速键来重复常用菜单项的动作(然而,加速键还可以用于运行非菜单功能)。例如,许多Windows程序都有一个包含“Delete”或“Clear”选项的“Edit”菜单,这些程序习 惯上都将Del键指定为该选项的加速键。使用者可以通过“ Alt 键”从菜单中选择“ Delete ”选项,或者只需按下加速键 Del 。当窗口消息处理程序收到一个WM_COMMAND消息时,它不必确定使用的是菜单还是加速键。为什么要使用加速键? 您也许会问:为什么我应该使用加速键?为什么不能直接拦截WM_KEYDOWN或WM_CHAR消息而自己实现同样的菜单功能呢?好处又在哪里呢?对于一 个单窗口应用程序,您当然可以拦截键盘消息,但是使用加速键可以得到一些好处:您不需要把菜单和加速键的处理方式重写一遍。对于有多个窗口和多个窗口消息处理程序的应用程序来说,加速键是非常重要的。正如我们所看到的,Windows将键盘消息发送给目前活动窗口的窗口 消息处理程序。然而对于加速键, Windows把WM_COMMAND消息发送给窗口消息处理程序,该窗口消息处理程序的代号在Windows函数 TranslateAccelerator中给出。通常这是主窗口,也是拥有菜单的窗口,这意味着无须每个窗口消息处理程序都把加速键的操作处理程序重写 一遍。如果您在主窗口的显示区域中,使用了非系统模态对话框(在下一章中会讨论)或者子窗口,那么这种好处就变得非常重要。如果定义一个特定的加速键以便 在不同的窗口之间移动,那么,只需要一个窗口消息处理程序有这个处理程序。
2023-06-28 02:01:471

键盘的加速键是哪一个

WM_SYSCOMMAND)的键组合。许多时候,程序使用加速键来重复常用菜单项的动作(然而,加速键还可以用于运行非菜单功能)。例如,许多Windows 程序都有一个包含“Delete”或“Clear”选项的“Edit”菜单,这些程序习惯上都将Del 键指定为该选项的加速键。使用者可以通过“ Alt 键”从菜单中选择“ Delete ”选项,或者只需按下加速键 Del 。当窗口消息处理程序收到一个WM_COMMAND 消息时,它不必确定使用的是菜单还是加速键。WM_KEYDOWN 或WM_CHAR 消息而自己实现同样的菜单功能呢?好处又在哪里呢?对于一个单窗口应用程序,您当然可以拦截键盘消息,但是使用加速键可以得到一些好处:您不需要把菜单和加速键的处理方式重写一遍。对于有多个窗口和多个窗口消息处理程序的应用程序来说,加速键是非常重要的。正如我们所看到的,Windows 将键盘消息发送给目前活动窗口的窗口消息处理程序。然而对于加速键, Windows 把WM_COMMAND 消息发送给窗口消息处理程序,该窗口消息处理程序的代号在Windows 函数TranslateAccelerator 中给出。通常这是主窗口,也是拥有菜单的窗口,这意味着无须每个窗口消息处理程序都把加速键的操作处理程序重写一遍。如果您在主窗口的显示区域中,使用了非系统模态对话框(在下一章中会讨论)或者子窗口,那么这种好处就变得非常重要。如果定义一个特定的加速键以便在不同的窗口之间移动,那么,只需要一个窗口消息处理程序有这个处理程序。
2023-06-28 02:01:561

用c++语言表示下列数学试 3x+6/y

float x = 0.0,y = 1;float result = 3*x+6/y;
2023-06-28 02:02:031

C语言遍历结构体数组

这句有问题:for(p=boy;p;p++) , p是以boy的地址开始,stu的长度来++的, 2次循环之后就越界了, 越界后,因为结构中有个指针,在printf的时候使用了这个指针,但这个指针是个随机的值,如果这个值在正常范围,这个循环一直继续下去,如果这个值不在正常范围,系统给出一个assert或者exception
2023-06-28 02:02:221

C语言图形界面怎么做出来?

1、windows平台下,含入windows.h,就可以编写图形界面的程序了。这东西跟面向过程还是面向对象没半毛钱关系。并且C++写界面一点都不麻烦,它也有很多类库可以选择,如VCL,MFC,还有qt之类的跨平台库。2、初学者写windows图形界面的程序,推荐C++ Builder,虽然现在它的发展不太明朗,但写起图形界面来,还是相当容易的,跟Visual Basic一样拖拖控件就好了。它跟Delphi用的是一个类库VCL。
2023-06-28 02:02:363

c++编程,学生成绩表要怎么做

题目不清楚。请发源码,代码太长就发连接
2023-06-28 02:02:491

c语言 怎么做图形界面的程序?

Windows本身就是一个基于图形内核的操作系统。如果在Windows下想做图形界面的话,直接调用Windows提供的系统调用函数就可以了。MFC是对这些系统调用的一个封装,是为了使用C++来简化程序编写工作的。如果是在Linux下,因为Linux本身不是基于图形内核的,所以一般是使用GTK、QT等图形库来生成图形界面的程序。
2023-06-28 02:02:594

c++如何编写窗口呀

楼主应该区分一下:C++和VC有什么差别。
2023-06-28 02:03:294

这个简单的VC++代码该怎么写

好极了
2023-06-28 02:03:382

mfc的accelerator怎么用

1、在CxxxApp中添加变量HACCEL m_hAccelerator;// 加速键结构体2、在BOOL CxxxApp::InitInstance()中添加加载项 // 关联加速键 m_hAccelerator=LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACC_MYACC));3、在BOOL CxxxApp::ProcessMessageFilter(int code, LPMSG lpMsg) 中进行消息处理{ if (code < 0) CWinApp::ProcessMessageFilter(code, lpMsg); //----------------------------------------------------- // 映射加速键 if (m_pMainWnd->m_hWnd) { if(m_hAccelerator) if (::TranslateAccelerator(m_pMainWnd->m_hWnd, m_hAccelerator, lpMsg)) return(TRUE); } return CWinApp::ProcessMessageFilter(code, lpMsg);}
2023-06-28 02:03:581

什么是键盘的加速功能

WM_SYSCOMMAND)的键组合。许多时候,程序使用加 速键来重复常用菜单项的动作(然而,加速键还可以用于运 行非菜单功能)。例如,许多Windows 程序都有一个包含 “Delete”或“Clear”选项的“Edit”菜单,这些程序习惯上都将 Del 键指定为该选项的加速键。使用者可以通过“ Alt 键”从 菜单中选择“ Delete ”选项,或者只需按下加速键 Del 。当窗 口消息处理程序收到一个WM_COMMAND 消息时,它不必 确定使用的是菜单还是加速键。 WM_KEYDOWN 或WM_CHAR 消息而自己实现同样的菜 单功能呢?好处又在哪里呢?对于一个单窗口应用程序,您 当然可以拦截键盘消息,但是使用加速键可以得到一些好 处:您不需要把菜单和加速键的处理方式重写一遍。 对于有多个窗口和多个窗口消息处理程序的应用程序来说, 加速键是非常重要的。正如我们所看到的,Windows 将键盘 消息发送给目前活动窗口的窗口消息处理程序。然而对于加 速键, Windows 把WM_COMMAND 消息发送给窗口消息 处理程序,该窗口消息处理程序的代号在Windows 函数 TranslateAccelerator 中给出。通常这是主窗口,也是拥有菜 单的窗口,这意味着无须每个窗口消息处理程序都把加速键 的操作处理程序重写一遍。 如果您在主窗口的显示区域中,使用了非系统模态对话框 (在下一章中会讨论)或者子窗口,那么这种好处就变得非 常重要。如果定义一个特定的加速键以便在不同的窗口之间 移动,那么,只需要一个窗口消息处理程序有这个处理程序。
2023-06-28 02:04:061

vc++ 里面插入了对话框资源后如何使用它呢,高分求助!!

建议看看孙鑫老师经典20集教程视频的第二集。应该会对你有所启发!
2023-06-28 02:04:132

如何捕获应用程序外的鼠标和键盘操作消息?请给出实例代码,感激不尽!

2023-06-28 02:04:201