barriers / 阅读 / 详情

如何正确的使用PeekMessage

2023-06-28 06:14:03
TAG: pee
共2条回复
北有云溪

PeekMessage和GetMessage函数的主要区别有:

  1. GetMessage的主要功能是从消息队列中“取出”消息,消息被取出以后,就从消息队列中将其删除;而PeekMessage的主要功能是“窥视”消息,如果有消息,就返回true,否则返回false。也可以使用PeekMessage从消息队列中取出消息,这要用到它的一个参数(UINT wRemoveMsg),如果设置为PM_REMOVE,消息则被取出并从消息队列中删除;如果设置为PM_NOREMOVE,消息就不会从消息队列中取出。

cloud123

HOWTO: How to Use PeekMessage() Correctly in Windows

SUMMARY

In the Windows environment, many applications use a PeekMessage()

loop to perform background processing. Such applications must allow the

Windows system to enter an idle state when their background processing

is complete. Otherwise, system performance, "idle-time" system processes

such as paging optimizations, and power management on battery-powered

systems will be adversely affected.

While an application is in a PeekMessage() loop, the Windows system cannot go idle. Therefore, an application should not remain in a PeekMessage() loop after its background processing has completed.

NOTE:

The PeekMessage method described in this article is only needed if your

application is a 32-bit application for Windows and is, for some

reason, unable to create threads and perform background processing.

MORE INFORMATION

Many Windows-based applications use PeekMessage()

to retrieve messages while they are in the middle of a long process,

such as printing, repaginating, or recalculating, that must be done "in

the background." PeekMessage() is used in these situations because, unlike GetMessage(), it does not wait for a message to be placed in the queue before it returns.

An application should not call PeekMessage() unless it has background processing to do between the calls to PeekMessage(). When an application is waiting for an input event, it should call GetMessage() or WaitMessage().

Remaining in a PeekMessage() loop when there is no background work causes system performance problems. A program in a PeekMessage() loop continues to be rescheduled by the Windows scheduler, consuming CPU time and taking time away from other processes.

In

enhanced mode, the Virtual Machine (VM) in which Windows is running

will not appear to be idle as long as an application is calling the PeekMessage function. Therefore, the Windows VM will continue to receive a considerable fraction of CPU time.

Many

power management methods employed on laptop and notebook computers are

based on the system going idle when there is no processing to do. An

application that remains in a PeekMessage() loop will

make the system appear busy to power management software, resulting in

excessive power consumption and shortening the time that the user can

run the system.

In the future, the Windows system will make more

and more use of idle time to do background processing, which is

designed to optimize system performance. Applications that do not allow

the system to go idle will adversely affect the performance of these

techniques.

All these problems can be avoided by calling the PeekMessage() function only when there is background work to do, and calling GetMessage() or WaitMessage() when there is no background work to do.

For example, consider the following PeekMessage()

loop. If there is no background processing to do, this loop will

continue to run without waiting for messages, preventing the system from

going idle and causing the negative effects described above.

// This PeekMessage loop will NOT let the system go idle.

for( ;; )

{

while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

{

if (msg.message == WM_QUIT)

return TRUE;

TranslateMessage(&msg);

DispatchMessage(&msg);

}

BackgroundProcessing();

}

This loop can be rewritten in two ways, as shown below. Both of the following PeekMessage() loops have two desirable properties:

u2022

They process all input messages before performing background processing, providing good response to user input.

u2022

The application "idles" (waits for an input message) when no background processing needs to be done.

Improved PeekMessage Loop 1

// Improved PeekMessage() loop

for(;;)

{

while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

{

if (msg.message == WM_QUIT)

return TRUE;

TranslateMessage(&msg);

DispatchMessage(&msg);

}

if (IfBackgroundProcessingRequired())

BackgroundProcessing();

else

WaitMessage(); // Will not return until a message is posted.

}

Improved PeekMessage Loop 2

// Another improved PeekMessage() loop

for (;;)

{

for (;;)

{

if (IfBackgroundProcessingRequired())

{

if (!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

break;

}

else

GetMessage(&msg, NULL, 0, 0, 0);

if (msg.message == WM_QUIT)

return TRUE;

TranslateMessage(&msg);

DispatchMessage(&msg);

}

BackgroundProcessing();

}

Note that calls to functions such as IsDialogMessage() and TranslateAccelerator() can be added to these loops as appropriate.

There is one case in which the loops above need additional support: if the application waits for input from a device (for example, a fax board) that does not send standard Windows messages. For the reasons outlined above, a Windows-based application should not use a PeekMessage() loop to continuously poll the device. Rather, implement an Interrupt Service Routine (ISR) in a Dynamic-Link Library (DLL). When the ISR is called, the DLL can use the PostMessage function to inform the application that the device requires service. DLL functions can safely call the PostMessage() function because the PostMessage() function is reentrant.

相关推荐

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