winwodws下c语言延时函数,使用gcc编译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

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命令

然后我们可以看到程序的图标已经出来了

0818b9ca8b590ca3270a3433284dd417.png

我们双击下运行

0818b9ca8b590ca3270a3433284dd417.png 可以看到左上角的图标,光标本来不是这个样子的,这是我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文件,你看这多科学

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值