c语言开发窗口应用程序
转载于:https://blog.csdn.net/liu_rong_fei/article/details/51271901
视频下载地址:链接: http://pan.baidu.com/s/1qYj9BMs 密码: fn8u
《c语言开发窗口应用程序》前言
本教程适合什么样的人学习
适合已经掌握基本的c语言语法,想进一步提高c语言,不想总是玩控制台和做数学计算题的朋友。
通过本教程能学到什么?
2.学会软件开发中常用的各种技术,如网络编程,多线程编程,数据库编程。
3.项目实战,让您知道软件是怎么一步一步制作的。可以学会c语言的模块化编程以及一些编程习惯和思路。
教学模式
从需求出发,通过项目实战教学,期间遇到的知识点再详细讲解,最终项目学会了,知识也学会了,并且比零散的知识更加容易记住,做到真正的学以致用。
第一阶段:windows图形编程
第一节:我的第一个窗口
窗口是什么?
Windows系统下如何编写带窗口的程序?
简而言之,windows API其实就是开发windows系统的程序员编写来提供给我们程序员用的函数。
为何其他的语言直接鼠标拖拉一下就能有界面?
很多语言都可以调用这些API,比如c、c++、java、vb、c#等等,调用的都是同样的函数,用法也是一样,只是不同语言调用方式上有点区别而已。
像vb、Delphi、易语言之类的,鼠标拖拉一下就有界面。其实只是对我们程序员隐藏了底层的东西,其本质还是一样调用了windows提供给他的API函数来实现。
动手编写第一个带窗口的程序?
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow)
应用程序当前实例的句柄。 这个值其实就是程序加载到内存空间后的首地址。
应用程序的先前实例的句柄。对于同一个程序打开两次,出现两个窗口第一次打开的窗口就是先前实例的窗口。
这个参数的作用就是接受命令行参数。比如在启动程序的时候用如下命令:
那么这个szCmdLine 中保存的就是 admin password这个字符串
这个参数的值,可以直接使用,也可以通过 GetCommandLine() 函数获取到。
int iCmdShow :这个是控制窗口的显示状态,比如最大化,最小化,隐藏。
上面这些参数解释,一开始看不懂,没有关系,完全不影响我们下面的学习,可以等到以后知识积累足够了,再回头好好理解。
对主函数了解差不多之后,我们来编写第一个窗口程序,代码如下:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow)
MessageBox(NULL, TEXT("窗口内容"), TEXT("窗口标题"), MB_OK);
开发环境搭建
本套教程采用的开发工具是VS2013,下载地址:http://www.zixue7.com/thread-36148-1-1.html
安装的时候遇到这个问题 要么装一下ie10 要么不管他 点继续。
LRESULT CALLBACK WndProc(HWND,UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
static TCHAR* szAppName =TEXT("zixue7");
下面的代码填充窗口类信息,如图标,鼠标样式,背景,过程函数等
wc.style = CS_HREDRAW | CS_VREDRAW; //窗口样式
wc.lpfnWndProc = WndProc; //过程函数
wc.hInstance = hInstance; //当前实例句柄
wc.hIcon = LoadIcon(hInstance,IDI_APPLICATION); //设置程序图标
wc.hCursor = LoadCursor(NULL,IDC_ARROW); //设置鼠标
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
MessageBox(NULL,TEXT("程序只能在windowsNT下运行"),
hwnd = CreateWindow(szAppName, //要注册的窗口类名
TEXT("c语言编写的第一个窗口程序-www.zixue7.com"),//窗口标题
CW_USEDEFAULT, //窗口距离屏幕左上角都横坐标
CW_USEDEFAULT, //窗口距离屏幕左上角都纵坐标
NULL); //指向一个值的指针,该值传递给窗口 WM_CREATE消息。一般为NULL
while (GetMessage(&msg,NULL, 0, 0))
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
return DefWindowProc(hwnd,message, wParam, lParam);
我们已经用纯代码生成了第一个窗口,这是一个好的开始,虽然只有短短的几十行代码,但是其中的信息量是非常大的,今后所有的窗口程序,我们都是基于上面的一个基本框架代码。
如何告诉?通过WNDCLASS这个结构来告诉他,我们设置这个结构的不同字段。
设置好字段之后,调用RegisterClass函数来告诉系统,我们要注册一个这样的窗口类型。
创建好窗口之后,默认是没显示的,我们还需要让他显示出来,同样是调用函数
ShowWindow来显示, 调用这个函数来更新窗口UpdateWindow
创建好窗口之后,不是要等待用户的操作吗?比如鼠标单击,键盘按键等等。
上面的 WndProc 这个函数就是专门处理这些消息,我们可以在这个函数中处理我们感
重点:消息机制(也就是消息循环具体是怎么循环的,消息从哪里来,要到哪里去)
2.操作系统捕捉到了这个单击左键的消息,就把它放到由操作系统管理的消息队列中。
3.我们的程序创建好之后就通过GetMessage函数一直不停的去检测消息队列中是否有自己关心的消息(至于如何判断哪些消息是我们窗口所关心的,这个由操作系统去管,此处不必深究。)
课后作业:
自己动手把上面的代码多输入几次,熟练他,并且理解整个创建窗口的过程。
注:目的不是让大家背代码,而是通过敲打代码来熟悉创建窗口的整个流程。
第二节:定时提醒喝水工具
使用场景与软件需求分析:
场景:作为程序员的我们,每天在电脑面前,低头抬头就是几个小时,有时候整天都不喝水,所以通过软件来定时提醒我们喝水是很有必要的。
窗口创建到销毁的整个过程。
1.调用CreateWindow之后,窗口显示之前,会收到,WM_CREATE消息(只会收到一次)
2.ShowWindow函数设置窗口的显示状态(根据WinMain函数最后一个参数来定)
3.UpdateWindow 会发送一个WM_PAINT,消息处理函数会去绘制窗口的客户区,至此窗口创建显示完毕。
4.当检测到用户单击关闭按钮的时候,系统会给程序发送一个WM_SYSCOMMAND消息。
5.WndProc消息处理函数将这个消息传给DefWindowProc,DefWindowProc会发出一个WM_CLOSE消息。
6.消息处理函数收到一个WM_CLOSE消息(一般可以在这里提示用户是否真的要关闭窗口)
8.PostQuitMessage函数将会发送一条WM_QUIT消息。
9.消息循环中的GetMessage函数获取到WM_QUIT消息之后,返回值为0,退出消息循环。
GDI简介
GDI (图形设备接口(GraphicsDeviceInterface)),他是windows提供的绘图接口,让我们无需关心底层设备以及设备驱动就可以在设备上输出内容,方便了开发工作。
DC是GDI内部保存的数据结构,跟显示器或打印机这类设备相关,DC中的有些属性值定义了GDI绘图函数的具体细节。
HDC是设备内容句柄,句柄实际上就是一个数值,Windows以它在内部使用对象。从windows获取到句柄以后,就可以在GDI函数中使用这个句柄来绘制内容了。
1.通过BeginPaint和EndPaint函数(会让无效区域变成有效区域):
处理WM_PAINT时,通过调用BeginPaint函数,他的返回值就是HDC,通常使用如下代码:
hdc = BeginPaint (hwnd, &ps) ;
2.通过GetDC 和ReleaseDC函数(不会让无效区域变成有效区域):
GetDC(NULL); 如果参数为NULL会获取到整个屏幕的设备句柄,意思就是,可以在整个屏幕上绘制文字或图像,比如以前看到过的一个全屏下雪的程序,就可以通过这个实现
窗口的绘制与更新
在以前的控制台程序中,我们用printf输出一段文字之后,他就会一直显示在窗口上,不必担心他会莫名其妙的消失。
在发生下面几种事件之一时,窗口消息处理程序会接收到一个WM_PAINT消息:
l ·在使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。
l ·使用者改变窗口的大小(如果窗口类别样式有着CS_HREDRAW和CS_VREDRAW位旗标的设定)。
l ·程序使用ScrollWindow或ScrollDC函数滚动显示区域的一部分。
l ·程序使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息。
在某些情况下,显示区域的一部分被临时覆盖,Windows试图保存一个显示区域,并在以后恢复它,但这不一定能成功。在以下情况下,Windows可能发送WM_PAINT消息:
在某些情况下,Windows总是保存它所覆盖的显示区域,然后恢复它。这些情况是:
注意:由于以上原因,我们必须在接收到WM_PAINT消息的时候,重新绘制我们的内容,并把窗口中的无效矩形变成有效矩形。
在呼叫BeginPaint函数之后,整个显示区域将变成有效区域。
程序也可以通过呼叫ValidateRect函数使显示区域内的任意矩形区域变为有效。如果这呼叫具有令整个无效区域变为有效的效果,则目前队列中的任何WM_PAINT消息都将被删除。
hdc = BeginPaint (hwnd, &ps) ;
如果不处理WM_PAINT必须把它传给DefWindowProc函数处理,他默认使用如下代码来处理WM_PAINT消息:
//错误写法,这样做的后果是,因为无效区域没有变成有效区域,所以会不停的收到WM_PAINT消息,消息队列中一直存在WM_PAINT消息!!!
实战编写定时提醒喝水工具
2.在WM_TIMER 消息中处理提示信息,比如闪动窗口,弹出窗口,播放声音等等。
定时器的使用
控制台下使用消息循环以及定时器
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
timerId = SetTimer(NULL, 0, 1000, TimerProc);
while(GetMessage(&msg,NULL,0,0))
课后作业:
第三节:制作一个简单的画板
本节知识点
SetPixel (hdc, x, y, crColor) ;
crColor = GetPixel (hdc, x, y)
MoveToEx (hdc, xBeg, yBeg, NULL) ;
LRESULT CALLBACK WndProc(HWND,UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
static TCHAR* szAppName =TEXT("zixue7");
下面的代码填充窗口类信息,如图标,鼠标样式,背景,过程函数等
wc.style = CS_HREDRAW | CS_VREDRAW; //窗口样式
wc.lpfnWndProc = WndProc; //过程函数
wc.hInstance = hInstance; //当前实例句柄
wc.hIcon = LoadIcon(hInstance,IDI_APPLICATION); //设置程序图标
wc.hCursor = LoadCursor(NULL,IDC_ARROW); //设置鼠标
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
MessageBox(NULL,TEXT("程序只能在windowsNT下运行"),
hwnd = CreateWindow(szAppName, //要注册的窗口类名
TEXT("c语言制作简单的画板-www.zixue7.com"),//窗口标题
CW_USEDEFAULT, //窗口距离屏幕左上角都横坐标
CW_USEDEFAULT, //窗口距离屏幕左上角都纵坐标
NULL); //指向一个值的指针,该值传递给窗口 WM_CREATE消息。一般为NULL
while (GetMessage(&msg,NULL, 0, 0))
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
static POINT pts[5000];//保存鼠标移动产生的坐标信息
static int leftDown = 0;//记录鼠标左键是否按下
static HPEN hPenRed, hPenGreen, hPenBlue, hPenCur;//创建画笔句柄
hPenRed = CreatePen(PS_DASH, 1, RGB(255, 0, 0));
hPenGreen = CreatePen(PS_DOT, 1, RGB(0, 255, 0));
hPenBlue = CreatePen(PS_SOLID, 5, RGB(0, 0, 255));
sprintf(buf, "key-code:%d\n", wParam);
xPos = LOWORD(lParam);//获取lParm中的低字,保存的是x坐标
yPos = HIWORD(lParam);//获取lParm中的高字,保存的是y坐标
InvalidateRect(hwnd, NULL, FALSE); //手动让整个窗口变为无效区域,从而产生WM_PAINT消息
SelectObject(hdc, hPenCur); //选择hPenCur为当前的画笔
Polyline(hdc, pts, i); //根据pts数组绘制 连续的线
ValidateRect(hwnd, NULL); //因为没有使用 BeginPaint,客户区域的无效区域不会自动变为有效区域,所以手动掉用这个函数来让那个整个客户区域变成有效区域
return DefWindowProc(hwnd,message, wParam, lParam);
第四节:制作简易计算器
知识点:
#define _CRT_SECURE_NO_WARNINGS
char labels[][10] = { "1", "2", "3", "+", "4", "5", "6", "-", "7", "8", "9",
BTN_CLS, BTN0, BTN_EQU, BTN_DIV };
char first[100], second[100], cz = 0;
LRESULT CALLBACK WndProc(HWND,UINT, WPARAM, LPARAM);
void create_button(HWND hwnd,int x, int y,int id);
void create_textbox(HWND hwnd);
void onCommand(HWND hwnd,WPARAM wParam);
INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR str,INT iCmdShow) {
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = WndProc;
wndClass.hInstance = hInstance;
wndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszClassName = TEXT("calc");
TEXT("calc"), // window class name
TEXT("计算器-noxue.com"),// window caption
WS_OVERLAPPEDWINDOW,// window style
CW_USEDEFAULT,// initial x position
CW_USEDEFAULT,// initial y position
hInstance,// program instance handle
while (GetMessage(&msg,NULL, 0, 0)) {
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,
for (int i = 0; i < 16; i++) {
create_button(hWnd, 10 + (i % 4 * 35), 50 + (i / 4 * 35), i);
return DefWindowProc(hWnd,message, wParam, lParam);
void create_button(HWND hwnd,int x,int y,int id) {
void create_textbox(HWND hwnd) {
void onCommand(HWND hwnd,WPARAM wParam) {
char buf[50] = "", text[100] = "";
h = GetDlgItem(hwnd, TEXT_BOX);
else if (w >=BTN_ADD && w <= BTN_DIV) {
h = GetDlgItem(hwnd, TEXT_BOX);
h = GetDlgItem(hwnd, TEXT_BOX);
sprintf(text, "%d%c%d=%d", num1, cz, num2, result);
h = GetDlgItem(hwnd, TEXT_BOX);
第五节:绘制透明背景的位图
如何显示位图
把id号修改成IDB_FLOWER(这个随你开心,建议IDB_作为前缀,这表示是一个Bitmap的编号)
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_FLOWER));
GetObject(hBitmap, sizeof(BITMAP), &bitmap);
hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBitmap);
BitBlt(hdc, 0, 0, fcx, fcy, hdcMem, 0, 0, SRCCOPY);
return DefWindowProc(hwnd,message, wParam, lParam);
如何绘制透明背景的位图
首先用ps将要显示的bmp图片背景变成纯色,比如蓝色,如下图:
最后通过位或操作(SRCPAINT)合并在一起,像右边那样就透明了(没有把图片扣好,所以玫瑰花周围还有蓝色的杂色)。
实现代码:
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
static HBITMAP hBitmap,hBitmapSky,hMaskBmp;
static int scx, scy,bgcx,bgcy;
hBitmap = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,MAKEINTRESOURCE(IDB_FLOWER));
hBitmapSky = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,MAKEINTRESOURCE(IDB_SKY));
GetObject(hBitmap, sizeof(BITMAP), &bitmap);
GetObject(hBitmapSky, sizeof(BITMAP), &bitmap);
hdcMem = CreateCompatibleDC(hdc);
hMaskDC = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBitmapSky);
BitBlt(hdc, 0, 0, bgcx, bgcy, hdcMem, 0, 0, SRCCOPY);
hMaskBmp = CreateBitmap(scx, scy, 1, 1, NULL);
SelectObject(hMaskDC, hMaskBmp);
SelectObject(hdcMem, hBitmap);
SetBkColor(hdcMem, RGB(0, 0, 0XFF));
//SetTextColor(hdcMem, RGB(0, 0, 0xff));
BitBlt(hMaskDC, 0, 0, scx, scy, hdcMem,0,0,SRCCOPY);
BitBlt(hdc, 0, 300, scx, scy, hMaskDC, 0, 0, SRCAND);
SetBkColor(hdcMem, RGB(0, 0, 0));
SetTextColor(hdcMem, RGB(255, 255, 255));
BitBlt(hdcMem, 0, 0, scx, scy, hMaskDC, 0, 0, SRCAND);
//将黑色背景的玫瑰花图片跟,跟蓝天白云背景带有黑色玫瑰花的图片做抑或操作
BitBlt(hdc, 0, 300, scx, scy, hdcMem, 0, 0, SRCPAINT);
return DefWindowProc(hwnd,message, wParam, lParam);
封装绘制透明背景位图的函数:
void DrawTransparentBmp(HDC hdc,HBITMAP hBitmap,int x,int y,COLORREF transColor)
GetObject(hBitmap,sizeof(bitmap), &bitmap);
hMaskBmp = CreateBitmap(bx, by, 1, 1, NULL);
hMaskDC = CreateCompatibleDC(hdc);
SelectObject(hMaskDC, hMaskBmp);
hMemDC = CreateCompatibleDC(hdc);
SelectObject(hMemDC, hBitmap);
SetBkColor(hMemDC, transColor);
BitBlt(hMaskDC, 0, 0, bx, by, hMemDC, 0, 0, SRCCOPY);
SetBkColor(hMemDC, RGB(0, 0, 0)); //告诉hMemDc,背景颜色设置为黑色。
SetTextColor(hMemDC, RGB(255, 255, 255));//告诉hMemDc,背景颜色设置为白色。
BitBlt(hMemDC, 0, 0, bx, by, hMaskDC, 0, 0, SRCAND);
SetBkColor(hdc, RGB(255, 255, 255));
SetTextColor(hdc, RGB(0, 0, 0)); //设置前景为黑色,再跟背景做与操作,这样就会留下一个黑色的洞
BitBlt(hdc, x, y, bx, by, hMaskDC, 0, 0, SRCAND);
//再把上面生成的两个图片(1黑色背景的要透明显示的图片,2.扣了个洞的背景图片)做与操作。
BitBlt(hdc, x, y, bx, by, hMemDC, 0, 0, SRCPAINT);
参考内容:
Combines the colors of the source and destination rectangles by using the Boolean AND operator.
Copies the source rectangle directly to the destination rectangle.
Combines the colors of the source and destination rectangles by using the Boolean OR operator.
SetBkColor和SetTextColor在Bitblt中的作用(难点):
SetBkColor告诉彩色图片dc,彩色图片中的什么颜色是背景色(windows默认背景色是白色,前景色是黑色)。
SetBkColor 告诉彩色图片dc黑白图片的背景色是什么颜色。
SetTextColor 告诉彩色图片dc 黑色图片的前景色是什么颜色。
如果是SRCCOPY就会把上面设置的颜色复制到彩色图片dc上;
如果是SRCAND 就会用彩色图片跟上面设置的背景色和前景色做位与操作。
SetBkColor(hMemDC, RGB(0, 0, 0)); //告诉hMemDc,背景颜色设置为黑色。
SetTextColor(hMemDC, RGB(255, 255, 255));//告诉hMemDc,背景颜色设置为白色。
BitBlt(hMemDC, 0, 0, bx, by, hMaskDC, 0, 0, SRCAND);
假如上面的hMemDC里面是彩色图片DC,hMaskDC是黑白图片DC。
BitBlt最后一个参数是SRCAND,意思就是,彩色图片跟一张背景为黑色,前景为白色 的黑白图片做位与操作(其实就是对应的颜色值做位运算,白色就是1,黑色就是0),
做好运算之后,就会显示彩色图片的前景部分(因为前景色是白色(1)),背景颜色是 黑色(0),所以,彩色图片的背景部分,就变成了黑色。
第六节:全屏玫瑰花实现(上节课的一点纠错)
知识点:
完善后的透明位图绘制函数:
void DrawTransparentBmp(HDC hdc,HBITMAP hBitmap,int x,int y,COLORREF transColor)
HDC hMaskDC = NULL, hMemDC = NULL, hBmpDC = NULL;
HBITMAP hMaskBmp = NULL, hBitmap1 = NULL;
GetObject(hBitmap,sizeof(bitmap), &bitmap);
hMaskBmp = CreateBitmap(bx, by, 1, 1, NULL);
hMaskDC = CreateCompatibleDC(hdc);
SelectObject(hMaskDC, hMaskBmp);
hBmpDC = CreateCompatibleDC(hdc);
SelectObject(hBmpDC, hBitmap);
//重新创建一张位图,不修改原来的位图,如果修改了,第二次绘制结果就不对
hMemDC = CreateCompatibleDC(hdc);
hBitmap1 = CreateCompatibleBitmap(hBmpDC, bx, by);
SelectObject(hMemDC, hBitmap1);
BitBlt(hMemDC, 0, 0, bx, by, hBmpDC, 0, 0, SRCCOPY);
bColor = SetBkColor(hMemDC, transColor);
BitBlt(hMaskDC, 0, 0, bx, by, hMemDC, 0, 0, SRCCOPY);
//BitBlt(hdc, x, y, bx, by, hMemDC, 0, 0, SRCCOPY);
bColor = SetBkColor(hMemDC, RGB(0, 0, 0));//告诉hMemDc,背景颜色设置为黑色。
fColor = SetTextColor(hMemDC, RGB(255, 255, 255));//告诉hMemDc,背景颜色设置为白色。
BitBlt(hMemDC, 0, 0, bx, by, hMaskDC, 0, 0, SRCAND);
bColor = SetBkColor(hdc, RGB(255, 255, 255));
fColor = SetTextColor(hdc, RGB(0, 0, 0)); //设置前景为黑色,再跟背景做与操作,这样就会留下一个黑色的洞
BitBlt(hdc, x, y, bx, by, hMaskDC, 0, 0, SRCAND);
//再把上面生成的两个图片(1黑色背景的要透明显示的图片,2.扣了个洞的背景图片)做与操作。
BitBlt(hdc, x, y, bx, by, hMemDC, 0, 0, SRCPAINT);
生成爱心路径代码:
hPen = CreatePen(PS_SOLID,5,RGB(255,0,0));
cout << "{" << pt.x << "," << pt.y << "},";
PolyBezierTo(hdc, pts+n-3, 3);
SetPixel(hdc, pt.x,pt.y,RGB(255,0,0));
全屏玫瑰花思路:
1.创建窗口时 使用WS_EX_TRANSPARENT | WS_EX_LAYERED这两个样式
hwnd = CreateWindowEx(WS_EX_TRANSPARENT |WS_EX_LAYERED, szAppName, //要注册的窗口类名
TEXT("子窗口创建-www.noxue.com"),//窗口标题
CW_USEDEFAULT, //窗口距离屏幕左上角都横坐标
CW_USEDEFAULT, //窗口距离屏幕左上角都纵坐标
NULL); //指向一个值的指针,该值传递给窗口 WM_CREATE消息。一般为NULL
SetLayeredWindowAttributes(hwnd, RGB(255, 255, 255), 0, LWA_COLORKEY); //白色为透明色
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE |SWP_NOMOVE);
for (int i = 0; i <sizeof(pts) / sizeof(pts[0]); ++i)
DrawTransparentBmp(hdc, hBitmap, pts[i].x, pts[i].y, RGB(0, 0, 0XFF));
第二阶段:网络编程和多线程
第三阶段:数据库编程
附:实战项目列表
c语言开发窗口应用程序相关推荐
- Apache Spark学习:利用Scala语言开发Spark应用程序
Spark内核是由Scala语言开发的,因此使用Scala语言开发Spark应用程序是自然而然的事情.如果你对Scala语言还不太熟悉,可以阅读网络教程 A Scala Tutorial for Ja ...
- c java 系统开发_java开发系统内核:使用C语言开发系统应用程序
更详细的讲解和代码调试演示过程,请参看视频 用java开发C语言编译器 如果你对机器学习感兴趣,请参看一下链接: 机器学习:神经网络导论 我们的操作系统通过增添内核接口导出机制后,已经可以作为平台,运 ...
- cs架构用什么语言开发_用Rust语言开发微信小程序
由于stdweb已经好久没有更新了,本人又写了另外一篇: JiaYe:用Rust语言开发微信小程序:wasm-bindgenzhuanlan.zhihu.com stdweb可以轻松将Rust代码编 ...
- c语言开发窗口程序,怎么用c语言做一个界面?
https://m.zjurl.cn/answer/6697137038547747083/?app=news_article&app_id=26&share_ansid=669713 ...
- C语言开发windows桌面程序,开发 windows 桌面软件,现在主流用什么技术?
桌面软件还是得win32,工具只有两个选择vc和delphi,不建议用.net,存在部署问题. 还有大佬说 桌面还是老老实实C#吧,看需求选择WPF或者Winforms 或者干脆激进一点,直接上win ...
- android 开发 python_用python语言开发android应用程序(1) - 格物致知的博客空间 - 中国移动开发者社区 - Powered by X-Space...
对于不熟悉Java语言,又想进入android开发领域的人来说,似乎有两个选择,一个是重新开始学习Java语言,然后开始学习android开发,一个就是到处求方问药:在android上可不使用XXX语 ...
- java语言开发微信小程序(一)
出于兴趣,自己用java搞了一次小程序,现在记录下来,就权当笔记吧.当然也希望能给看到这篇文章的同志一些帮助.这篇文章分两部分,这部分先介绍小程序开发的一些基础知识,包括需要做的准备.按照习惯,先贴一 ...
- c语言开发物业收费程序,C语言程序的设计_物业管理系统方案
<C语言程序的设计_物业管理系统方案>由会员分享,可在线阅读,更多相关<C语言程序的设计_物业管理系统方案(10页珍藏版)>请在人人文库网上搜索. 1.i nclude std ...
- 使用c语言开发的象棋程序,基于C++和MFC开发象棋程序
这是我要和大家分享的基于C++和MFC开发的一个象棋程序,目的是练习编程实践和大家分享同时希望大家能给出指教. 进入主题 一.棋盘分析 这是我绘制的棋盘,棋盘的组成由9条竖线和10条横线构成.这儿我们 ...
最新文章
- 【LeetCode】TreeNode类实现解析(java实现)
- 好程序员前端教程之JavaScript闭包和匿名函数的关系详解...
- 程序员7天长假出游指南
- 蚂蚁集团涵畅:再启程,Service Mesh 前路虽长,尤可期许
- SonarQube搭建和使用教程
- java interface_Java中的接口(interface)
- 若依框架集成redis缓存
- 速达服务器启动时显示对象名ACCSET无效
- python找不到csv文件路径_无法识别csv的构造文件路径。但文件是
- 上位机和下位机计算机联锁,上位机与下位机之间的连接
- 肩周炎的治疗方法哪个最有效
- 在CityEngine中制作绘制路网
- EXCEL转PDF最便捷的方法
- 微信小程序绑定手机号js代码
- Debian7升级glibc至2.15
- python中的scipy基础知识_python中SciPy是什么?
- CSAPP Final Exam Preparation: reading solution records (2b continued)
- 杭电OJ100题——2002-2005(C++版)
- android获取系统蓝牙版本,[Android O] 蓝牙设备默认名称获取
- monkey脚本试验