C语言windows,OpenGL编程

MSG当中的pt是鼠标坐标,那么它是相对屏幕呢还是相对窗口的呢,当发生电击事件的时候,lparam中的坐标又是相对于哪的呢,都具体点,是哪个角?
在子线程中建立了窗口,句柄保存在整个程序的全局变量中了,如何保证子线程退出窗口还能继续使用?
因为我想让子线程异步完成对窗口的初始化然后给主线程用。
我使用OpenGL绘制整个窗口中的所有东西,如何让像素的alpha来决定这个像素的透明度呢,就是说有的地方可以看到桌面上的其他东西。
C语言,如何把一个icon或者bmp加载成窗口的图标和整个应用程序的图标呢。
我在api中找到了beep函数,但是它要打开扬声器,再关闭,连续调用很不流畅,PlaySound又只能读取wav
我还不会写资源文件,有没有其它函数可以流畅的播放声音,比如打开扬声器,然后没有关闭指令之前扬声器就一直待命,能否控制我要播放的声音的音量呢?
还有,C语言的程序怎样才能想PPTV之类的那样在持续使用的时候保持屏幕常亮呢。
我现在只会读取BMP文件,请问bmp文件能保存像素的alpha吗?我想把图片做的圆滑一点。
从dll中导入数据的时候除了GetPocAddress还有没有别的函数了,因为这个只返回地址,导入变量的话还不如直接在文件中声明了,而且它的返回值类型是FARPROC如何才能避免类型不统一的警告提示呢,
还有,一个函数指针的类型强制转换怎么弄比如我想把void型的一个函数指针转换成 DWORD WINAPI 型的怎么办到呢?
还有,当一个函数指针指向NULL的时候执行它的话,会没反应还是会出错呢?
Dev C++ 5.6.1 要怎么设置编译器才能手动生成DLL,特别不喜欢建立工程的感觉,因为多了很多用不到的文件,和一些我自己不知道的算法。
我编的是窗口程序,那个dos的界面在实际应用的时候并不需要,怎么消除呢?
问题有点多,非常急,希望得到好的解答,谢谢。
还有一个小的问题,不如说是牢骚,Dev C++ 5.6.1是不是测试版?为什么出bug的次数比我调试的次数还多?

    查找 MSDN 可以得知,MSG 里面的 pt 坐标是相对于窗口的左上角的;

2. 至于声音控制和播放,可以使用 Windows 自带的 MCI API,或者使用 DirectSound 来播放,我推荐你使用 un4seen 的 BASS,简单实用强大,一两个函数就可以播放音效了;

3. 你要使用 alpha blend 与桌面进行镂空运算,就必须首先获得桌面的窗体句柄,OpenGL 的 alppha 运算我不是很懂,不过 Direct3D 的话就简单多了;

4. 屏幕常亮,其实就是阻止系统进入休眠状态,每当系统要进入休眠状态之前,都会向系统的所有窗口发送一条消息,你拦截这条消息,进行特别的处理就可以防止系统进入休眠了,至于是什么消息,请查看 MSDN,我也好久没用过这条消息了;

5.bmp 文件可以保存 alpha 通道,使用 32bit 色深的 bmp 文件就可以了,RGB 分别 8bit,alpha 通道 8bit,不过说到 alpha 通道,tga 或者 png 图片更加合适,因为他们可以进行无损压缩;

6.用 GetPocAddress 导出函数,只能用类型强制转换,这个是 windows 的原则,我们只能去迎合它了 ... 

7. 执行 NULL 指针的话,不同的系统会有不同的反应,XP 是直接程序崩溃,Vista 或者以上的系统,就会提示无响应

8. 如果你建立的工程是 Win32 窗口程序,那么就不会有 DOS 窗口,如果你建立的是 Win32 控制台程序,那么就会有 DOS 窗口;如果你使用 OpenGL 实用库来创建 OpenGL 程序,那个 DOS 窗口是无法消除的,它可以帮助你进行错误排查

9. 不要用 Dev C++ 了,用 VS2010 吧,这是行业规范


最后,祝楼主学习愉快

追问

我没有建立工程,是自己写的文件然后编译,那么如何手动,创建dll呢,至于屏幕常亮的话那个特殊操作具体怎么办呢,您所谓的镂刻是不是先画桌面上相应位置的画面,然后再画自己,这样的话能看到后面的窗口吗,这个句柄到底是桌面还是屏幕呢还有就是如何在子线程中建立所有线程都能用的窗口呢?最近问的问题太多了,我已经把所有的金币悬赏了,拜托了。

追答

创建 dll 需要改变连接器的链接选项,默认是输出 exe 文件的,不同的连接器有不同的选项,请参考连接器手册,这个我也帮不了你了;
镂空就是指绘制不规则图片嘛,非矩形图片都是不规则图片,利用 opengl 的 alpha 运算,可以让 opengl 忽略某些不符合条件的像素,从而绘制镂空效果,这个涉及 opengl 的颜色运算;
一定要拿到桌面的窗体句柄,至于屏幕句柄和桌面句柄是否一样,这个我也不清楚,不过网上有很多文章,【在桌面渲染 opengl】【在桌面渲染 d3d】,这样子搜索应该就可以搜到的了;
你说的【子线程中简历所有县城都能用的窗体】具体是指什么效果呢,请仔细描述,没关系的,我可以帮你慢慢解决;

追问

这样,我在程序起始的时候有个初始化的过程,负责导入DLL和建立窗口并进行一些设置,但是如果这是个阻塞函数的话,程序显得笨拙,我想这样,把初始化函数挂接到子线程中,初始化的过程非常正常,初始化一完毕,建立的窗口也被关闭了,也没有什么报错之类的。
对了,我用的是Mingw32 的一套,连接器设置要怎么办呢,没时间了,根本来不及下载别的编译器了,今天晚上就必须写出成品了。

追答

这么赶,估计时间上来不及了;
多线程怎么可能会阻塞呢,多线程就是为了解决单线程阻塞才发明的,是不是框架写错了?
难道你的主线程没有等待之类的操作么,贴出代码,我帮你看看;
Mingw32 我没用过,真心帮不上忙了,不过这个可以网上查资料,一下子就可以解决了,我用的是 MS 系列的连接器;

追问

不是子线程阻塞,是为了防止阻塞,用多线程,但是多线程的窗口保不住~~要哭啦,框架都写得差不多了,就差这些最重要的细节了。

追答

你消息处理是放在主线程,然后创建初始化是放在新建的线程吧,上 QQ 吧,我远程帮你看看

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-02-28
纯C有点难啊。也不要在游戏开发人员可以了解过夜,建议学习C + +。再看看你特别想开发平台。传统的Windows,则您可以学习一点Windows程序设计和直接DirextX编程。苹果再转移目标C的Android,然后转移JAVA。网页游戏转移的ActionScript。除了Windows使用DirectX 3D方面,其它的是OpenGL的,Windows还可以使用OpenGL。

对于苹果,Android和网页游戏我不太了解,对有关Windows的DirectX学习

Windows程序设计的几本书推荐:

查尔斯Petzold的Windows程序设计第五版(很老的书,而是一个基于Windows的程序设计)

的Windows核心编程第五版(本非常好的书,有人可能会开始看到有点难度,但提供了一个Windows程序的性能质量是绝对有帮助)

的DirectX方面

弗兰克Luna的介绍的基础上(对DirectX的3D游戏编程与DirectX 9.0cA着色方法,但似乎没有中国版本不建议在以前的版本的介绍与DirectX 9.0 3D游戏编程,因为以前的版本是基于DX的固定管道,而不是着色器9,固定管道的DX10从一开始就已经取消了,这所学校的不是之前的未来)

王在精通DirectX 3D图形与动画程序设计(觉得DirectX的中国书籍中最好的,最全面的一个)

的OpenGL方面

OpenGL编程指南第七版(所谓的OpenGL红宝石本书中,我们建议,但我还没有看到。我听说中国translation很烂)

如果你只是想作一个简单的2D游戏,那么你就可以直接的C + +的一些完成后,考虑到学校的2D游戏引擎做的,如HGE。 3D游戏引擎,建议要学会去与DX或OpenGL。追问

首先感谢这位的尽心回答,但是我只剩下一天的时间,不会C++不会Direct,目标平台就是windows

第2个回答  2014-02-28

1.MSG的坐标 查阅wm_mousemove消息

The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.
The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.

2.绝对不要把UI线程放入子线程, 一切UI操作留给主线程。

3.窗口是不属于OpenGL范畴的, 取决于系统, 所以OpenGL的像素透明不能让窗口透明

4.有相应的API和结构 比如WNDCLASS

5.既然图像用OpenGL为什么声音不用 OpenAL

6. SystemParametersInfo()来关闭屏幕保护程序,结束后再重新打开

7.bmp 文件可以保存 alpha 通道

8.导入数据直接先dll导出静态库 然后头文件声明即可

9.使用typedef函数

10.取决于系统是否安装了系统级调试器以及一系列的其他设定 不同机器上不同表现 

11 使用gcc手工编写makefile即可  一切尽在掌握 另外Dev Cpp是基于makefile的 没有任何你看不懂的操作 你看不懂 只能说明你还没达到能看的懂的水平

12.建立win32工程即可

13.Dev C++最高版本是4.9.9.2 你说的版本是个二道贩子接手的 自然bug很多

追问

能给我粗略的讲一下makefile的工作机制和基本应用吗,有时间我会查资料的

追答

target ... : prerequisites ...
command
...
...

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites就是,要生成那个target所需要的文件或是目标。

command也就是make需要执行的命令。(任意的Shell命令)

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。

说到底,Makefile的东西就是这样一点

第3个回答  2014-02-28
dev c++不发展了,codeblocks替代了它。http://www.codeblocks.org/追问

哥,你只回答了一个问题,还是我发的牢骚~~实在点行不

追答

windows里当然是相对窗口,win32坐标系和opengl坐标系不一样,win32坐标系原点在左上角

追问

其他的呢,别一个一个来呀~~
那个GetCursorPos也是相对于当前窗口吗?应该不是吧,具体是什么呢?
OpenGL绘制的时候单缓存,但如果在两个线程中同时绘制不同的或者说是互补的画面然后
不断的Swapbuffers()是不是可以让两个画面互补呢?

相似回答