使用gcc编译Windows程序并使用资源文件

news/2024/7/21 12:52:29 标签: windows, vim, 编辑器

使用gcc编译Windows程序并使用资**
2012-12-17 quasiceo 阅 1528 转 9
使用gcc编译Windows程序并使用资***
2012-08-22 01:39:29| 分类: Windows编程 |字号 订阅

一直灰常灰常喜欢使用vim+gcc组合,但是VS开发环境却又是那么的"先进"那么的人性化,VS让很多东西都变得简单起来,因为它集成了一整套的工具,但是就编辑功能而言与之vim相差甚远,舍不得vim于是进行相关配置后vim也可以变得很强大,于是果断放弃了VS继续vim+gcc,虽然在windows下编程使用这样的组合有点"对不住"微软,但习惯难以更改,说起来我这个人真是一身的臭毛病,于是可以想像我肯定喜欢手写Makefile文件,什么,Makefile文件是什么?你不明白,我想你对此篇文章也不会感兴趣.好了废话不多说了
使用gcc编译windows程序时(这里指Windows API编程)需要加上-mwindows选项,不然编译不通过哦
还有要说的一点就是使用资源文件,这个似乎使用VS很容易搞定,只需要选择创建资源文件,然后在程序中包含头文件就可以使用了,但使用gcc的话应该怎样连接资源文件呢?其实这个也比较简单了,我们只需要自己手动写一个资源文件然后连接下就可以了(看,这个家伙又自己动手写了),我们就以一个简单的hello world程序来说明如何使用gcc编译windows API程序并加上图标,光标资源
首先我们先创建一个图标文件和一个光标文件,然后给它们随便取一个名字,比如music.ico,mouse.cur
然后我们写一个资源文件,内容如下
IDI_ICON ICON music.ico
IDC_CURSOR CURSOR mouse.cur
IDI_ICON和IDC_CURSOR这两个是我们自己取的任意名称,它们的作用主要是在程序中皀它们作为字符串来"标识"它们,也可以用一个整数来替换它们,我比较喜欢用字符串,依个人爱好吧,ICON和CURSOR是两个关键字,它们分别表示图标资源和光标资源,后面的music.ico和mouse.cur是我们创建的两个文件,这里由于我把这两个文件放在当前路径所以可以直接写它们的名字,如果放在其它目录下的话一定要写上绝对路径,比如music.ico文件在C盘根目录下你就应该写成"C:\music.ico"这样
下面是我们hello的程序,它使用Windows API
/hello.c/
#include <windows.h>
LRESULT CALLBACK wndproc(HWND,UINT,WPARAM,LPARAM);
void init_wndclass(HINSTANCE,TCHAR*,WNDCLASS*);
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hprevinstance,LPSTR line,int cmd)
{
TCHAR app_name[]=TEXT(“Hello World!”);
WNDCLASS wndclass;
MSG msg;
HWND hwnd;
init_wndclass(hinstance,app_name,&wndclass);
RegisterClass(&wndclass);
hwnd=CreateWindow(app_name,app_name,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,NULL,NULL,hinstance,NULL);
ShowWindow(hwnd,cmd);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
void init_wndclass(HINSTANCE hinstance,TCHAR *app_name,WNDCLASS wndclass)
{
wndclass->cbClsExtra=0;
wndclass->cbWndExtra=0;
wndclass->hCursor=LoadCursor(hinstance,“IDC_CURSOR”); //在这里我们加载光标资源
wndclass->hIcon=LoadIcon(hinstance,“IDI_ICON”); //加载图标资源
wndclass->hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass->lpfnWndProc=wndproc;
wndclass->lpszClassName=app_name;
wndclass->lpszMenuName=NULL;
wndclass->style=CS_VREDRAW|CS_HREDRAW;
wndclass->hInstance=hinstance;
}
LRESULT CALLBACK wndproc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
static int client_x,client_y,char_x,char_y,str_len;
TEXTMETRIC tm;
PAINTSTRUCT ps;
HDC hdc;
HINSTANCE hinstance;
switch(message)
{
case WM_CREATE:
hinstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
hdc=GetDC(hwnd);
GetTextMetrics(hdc,&tm);
char_x=tm.tmAveCharWidth;
char_y=tm.tmHeight;
ReleaseDC(hwnd,hdc);
SetClassLong(hwnd,GCL_HICON,(LONG)LoadIcon(hinstance,“IDI_ICON”)); //有时候会发现程序的图标是有了,但是在左上角却还是没有加载上,这样做保险点
SetClassLong(hwnd,GCL_HCURSOR,(LONG)LoadCursor(hinstance,“IDC_CURSOR”)); //与上类似
str_len=lstrlen(“Hello World!”);
return 0;
case WM_SIZE:
client_x=LOWORD(lparam);
client_y=HIWORD(lparam);
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
SetTextColor(hdc,RGB(0,0,255));
TextOut(hdc,client_x/2-str_len
char_x/2,client_y/2-char_y/2,TEXT(“Hello World!”),str_len);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wparam,lparam);
}
好了最后就是我们的Makefile文件了
hello:hello.o my.o
gcc -o hello hello.o my.o -mwindows
hello.o:hello.c
gcc -c hello.c
my.o:hello.rc
windres hello.rc my.o
clean:
rm hello.exe my.o hello.o
现在执行make命令
然后我们可以看到程序的图标已经出来了

在这里插入图片描述

我们双击下运行
在这里插入图片描述

可以看到左上角的图标,光标本来不是这个样子的,这是我linux下的光标,我们设置的光标这样截图截不下来,但我以人格保证它正确加载了.
这里我们从Makefile中可以看到我们使用了-mwindows选项编译Windows程序,我们连接了my.o,这个my.o是使用windres hello.rc my.o生成的,所以我们也可以这样来编译这个程序并连接资源文件
gcc -c hello.c
windres hello.rc my.o
gcc -o hello hello.o my.o -mwindows
显然一个一个命令去敲的话太过于麻烦,于是我们使用Makefile文件,你看这多科学


http://www.niftyadmin.cn/n/1816619.html

相关文章

jQuery(function($){...})与(function($){...})(jQuery)知识点分享

写jQuery插件时一些经验分享一下。 一、推荐写法 jQuery(function($){ //coding }); 全写为 jQuery(document).ready(function($){ //coding }); 1、意义为在DOM加载完毕后执行了ready()方法。 2、$私有变量&#xff0c;与其他插件不冲突 二、不推荐写法 (function($){ /…

不安装framework,运行你的程序

方法一&#xff1a; 使用飞信VMDotNet使C#程序脱离.NET FRAMEWORK也能运行的一些心得 下面先来简单说明一下VMDotNet文件夹吧&#xff0c;在这个文件夹之下有一个v2.0.50727文件夹&#xff0c;很明显是.NET FRAMEWORK的版本号啦&#xff0c;进入这个文件夹&#xff0c;里面有一…

【vue3+ts后台管理】路由守卫和退出登录

文章目录首页菜单选中首页重定向路由守卫退出登录首页菜单选中 每次我们刷新页面&#xff0c;左侧菜单都没有选中 修改 HomeView.vue&#xff0c;获取当前页面 path&#xff0c;给 Menu 菜单的default-active动态赋值&#xff0c;这个值是默认激活菜单的 index <el-menua…

【uni-app从入门到实战】环境搭建和配置学习

文章目录创建项目globalStyle全局外观配置pages页面配置配置基本的tabbarcondition启动模式配置创建项目 原视频地址&#xff1a;Uni-App从入门到实战-黑马程序员杭州校区出品 前提&#xff1a;需要安装 HBuilderX 和 微信开发者工具 用 HBuilderX 创建一个 uni-app 项目&am…

POSIX结束

POSIX表示可移植操作系统接口&#xff08;Portable Operating System Interface of UNIX&#xff0c;缩写为 POSIX &#xff09;&#xff0c;POSIX标准定义了操作系统应该为应用程序提供的接口标准。 POSIX标准意在期望获得源代码级别的软件可移植性。换句话说&#xff0c;为一…

js判断鼠标同时离开两个div

纠结了两天&#xff0c;憋出了个蛋&#xff0c;欢迎拍砖&#xff01;&#xff01;&#xff01; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"…

【uni-app从入门到实战】组件和样式学习

文章目录Text组件view组件button组件image组件样式学习rpximport字体图标scss使用组件使用入门教程Text组件 Text 是文本组件&#xff0c;用于包裹文本内容。相当于 html 中的 span 标签。text组件官方文档 <view><text>宇宙山河烂漫&#xff0c;生活点滴温暖<…

Linux快照

原文链接 https://www.cnblogs.com/sanyuanempire/p/6168857.html Linux 快照 这也就是为什么系统恢复功能会让人感觉如此神奇。你可以很快地重新回到工作中去&#xff0c;就像什么事情都没有发生一样&#xff0c;也不用去管造成系统故障的原因。这也就是为什么系统恢复功能在…