C语言学习笔记12

阅读: 评论:0

C语言学习笔记12

C语言学习笔记12

C语言学习笔记12

      • 文件
      • 文本文件复制
      • Win32窗口创建
      • Win32:键盘消息/鼠标消息/绘图/画刷
      • Win32:定时器
      • Win32:定时器应用小例
      • Win32:贴图

文件

//文件(字符形式ASCII 二进制形式)
//缓冲区 int getchar();//写入文件(数据→缓冲区→物理文件)
//读取文件(写入的反向)
//代码只完成数据→缓冲区#include <stdio.h>int main() 
{char buf[1024] = { 0 };//初始化,文件里没有,读字符串可以省事size_t n;FILE* pFile;fopen_s(&pFile,"C:\Users\Nothingserious\source\repos\Kelin 4-28to5-7\文件\", "r+");//FILE *pFile = fopen("路径","打开方式")//fopen不安全,所以使用fopen_s//如果pFile返回值为NULL则打开文件失败;//路径需要补;路径不要复制,盘符和冒号需要自己打//文件操作n = fread(buf, 1, 1024, pFile);//记录返回值(写满的次数),一次一个字节,读缓冲区大小次数,则返回值为成功得到字节数// 	   	n = fread(buf, 1, 1, pFile);   后续的写入部分无法完成//原因:从读到写必须经过文件的末尾,如果没有经过末尾那么需要调用fseek函数(无须波动到某个位置,只要调用即可)//		fseek(pFile,0,SEEK_CUR);//当指定 "r +"、 "w +" 或 "a +" 访问类型时,将同时启用读取和写入 (该文件被称为 "更新" ) 。 但是,当你从读取切换到写入时,输入操作必须遇到 EOF 标记。 如果没有 EOF,必须使用对文件定位函数的干预调用。 文件定位函数是 fsetpos 、 fseek 和 rewind 。 当从写入切换到读取时,必须使用对 fflush 或文件定位函数的干预调用。printf("%dn", n);printf("%sn", buf);fwrite("000", 1, 3, pFile);fclose(pFile);//及时关闭return 0;
}

文本文件复制

#include <stdio.h>int main()
{FILE* pFile1 = NULL;FILE* pFile2 = NULL;char c;fopen_s(&pFile1, "C:\Users\Nothingserious\source\repos\Kelin 4-28to5-7\文件\", "r");fopen_s(&pFile2, "C:\Users\Nothingserious\source\repos\Kelin 4-28to5-7\文件\", "w");while ((c = fgetc(pFile1)) != EOF) {fputc(c, pFile2);}fclose(pFile1);fclose(pFile2);return 0;
}

Win32窗口创建

VS2019的项目创建步骤:Windows桌面向导—>桌面应用程序—>空项目

应用程序实例:正在运行的程序
句柄:类似于指针,但区别在于无法修改句柄内容

前一个应用实例:通过应用程序A打开另一个应用程序B,则A为前一个应用实例
前一个应用实例 VS 应用程序的子窗口:关闭A,看B是否会被关闭,如果关闭则为子窗口

#include <windows.h>LRESULT CALLBACK MYWNDPROC(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);//如何判断一个指针指向的类型:去掉一个*,再去掉变量名int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevlnstance,LPSTR lpCmdLine,int nCmdShow)
{WNDCLASSEX ex;HWND hWnd;MSG Msg;//1.设计窗口(最复杂)ex.style = CS_HREDRAW | CS_VREDRAW;//给二进制中的某一位赋值用或,判断有没有值用与//CS_HREDRAW和CS_VREDRAW这些样式在计算机里的保存形式为每个样式的二进制数值中只有一个1,要是两个样式或起来,则0x00000001 | 0x00000010 就变成0x00000011,则程序把这个当成同时使用两个样式,这是微软固定的。//0x00000011 & 0x00000001 结果为0x00000001所以样式应用了,0x00000011 & 0x00000000 结果为0x00000000所以样式没有应用//注意区分|和||,&和&&的区别,前者为位运算,后者为逻辑运算ex.cbSize = sizeof(ex);ex.cbClsExtra = 0;ex.cbWndExtra = 0;ex.hInstance = hInstance;ex.hIcon = NULL;ex.hCursor = NULL;ex.hbrBackground = CreateSolidBrush(RGB(0, 255, 0));ex.hIconSm = NULL;ex.lpfnWndProc = MYWNDPROC;//消息处理函数(队列形式——先进先出)ex.lpszMenuName = NULL;//ex.lpszClassName = "aaa";//报错,因为文件采用的是Unicode字符集而"aaa"是多字节字符集,在C中由于C是弱类型语言,所以可以使用,但C++中会出现问题,弱类型语言只要两种类型相近就不会认为是错误。c++则是强类型语言,会严格将两种类型区别开,只要类型不对就会报错。//ex.lpszClassName = L"aaa";  //通配符,但不一定好使,可以用另一种方式:“Kelin 5-7文件右键——属性——字符集:将Unicode字符集改为多字节”ex.lpszClassName = "aaa";//2.注册窗口RegisterClassEx(&ex);//3.创建窗口hWnd = CreateWindow(ex.lpszClassName, "原谅绿", WS_OVERLAPPEDWINDOW, 50, 50, 500, 500, NULL, NULL, hInstance, NULL);//4.显示窗口ShowWindow(hWnd, SW_SHOW);//消息循环while (GetMessage(&Msg, NULL, 0, 0)){//翻译消息TranslateMessage(&Msg);//分发消息DispatchMessage(&Msg);}return 0;
}LRESULT CALLBACK MYWNDPROC(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{switch (message){case WM_CLOSE:PostQuitMessage(0);break;}return DefWindowProc(hWnd, message, wParam, lParam);
}

Win32:键盘消息/鼠标消息/绘图/画刷

#include <windows.h>
#include <stdio.h>LRESULT CALLBACK MYWNDPROC(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevlnstance,LPSTR lpCmdLine,int nCmdShow)
{WNDCLASSEX ex;HWND hWnd;MSG Msg;//1.设计窗口(最复杂)ex.style = CS_HREDRAW | CS_VREDRAW;ex.cbSize = sizeof(ex);ex.cbClsExtra = 0;ex.cbWndExtra = 0;ex.hInstance = hInstance;ex.hIcon = NULL;ex.hCursor = NULL;ex.hbrBackground = CreateSolidBrush(RGB(0, 255, 0));ex.hIconSm = NULL;ex.lpfnWndProc = MYWNDPROC;ex.lpszMenuName = NULL;ex.lpszClassName = "aaa";//2.注册窗口RegisterClassEx(&ex);//3.创建窗口hWnd = CreateWindow(ex.lpszClassName, "原谅绿", WS_OVERLAPPEDWINDOW, 50, 50, 500, 500, NULL, NULL, hInstance, NULL);//4.显示窗口ShowWindow(hWnd, SW_SHOW);//消息循环while (GetMessage(&Msg, NULL, 0, 0)){TranslateMessage(&Msg);DispatchMessage(&Msg);}return 0;
}LRESULT CALLBACK MYWNDPROC(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{int x, y;char str[20] = {0};HDC hDc;PAINTSTRUCT pS;HBRUSH hBrush;switch (message){case WM_CLOSE:PostQuitMessage(0);break;//case WM_KEYDOWN://	if (65 == wParam)//	{//		MessageBox(hWnd, "要想生活过得去 头上总得有点绿", "忍者神龟", MB_OK);//	}//	//当键盘按下A的时候弹出一个对话框//	break;case WM_KEYDOWN://要求:当键盘按下的时候画一个圆//只有在重绘消息中用beginPaint和endPaint,其余消息中都直接用getDC和releaseDC即可hDc = GetDC(hWnd);hBrush = CreateSolidBrush(RGB(255, 0, 0));//创建了红色的画刷SelectObject(hDc, hBrush);//关联两个设备(画刷和hDc关联 达到上色目的),其返回值为关联前的同一类型设备,比如现在其返回值为默认的白色的画刷而不关联的红色画刷,若有需要可以用一个变量来记录Ellipse(hDc, 120, 120, 180, 180);ReleaseDC(hWnd,hDc);break;/*case WM_LBUTTONDOWN:x = LOWORD(lParam);y = HIWORD(lParam);//取坐标//sprintf(str, "%d,%d", x, y);//不安全sprintf_s(str,20,"%d,%d",x,y);//格式化写入MessageBox(hWnd, str, "提示", MB_OK);//点击鼠标后将提示鼠标的坐标位置//MessageBox(hWnd, "要想生活过得去 头上总得有点绿", "忍者神龟", MB_OK);当鼠标左键按下的时候弹出一个对话框break;*///要求:鼠标点击位置花一个直径为50*50的圆,鼠标点击位置为圆心case WM_LBUTTONDOWN:x = LOWORD(lParam);y = HIWORD(lParam);//取坐标hDc = GetDC(hWnd);Ellipse(hDc, x - 25, y - 25, x + 25, y + 25);ReleaseDC(hWnd, hDc);break;case WM_PAINT:	//重绘消息hDc = BeginPaint(hWnd, &pS);//用完hDc后需要归还,否则别的消息无法获取Rectangle(hDc, 100, 100, 250, 200);//窗口出来的时候就有一个矩形EndPaint(hWnd, &pS);//归还break;}//该程序采用了水平刷新和竖直刷新,当窗口发生变化的时候(最大最小化等任意窗口大小拉伸改变),会触发重绘消息,因此在本程序中,点击生成的圆在窗口改变后会消失,如果只采用水平刷新,那么竖直拉动窗口发生变化时不会触发重绘消息,圆不会消失,只有水平变化时才会消失。return DefWindowProc(hWnd, message, wParam, lParam);
}

Win32:定时器

#include <windows.h>
#include <stdio.h>LRESULT CALLBACK MYWNDPROC(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevlnstance,LPSTR lpCmdLine,int nCmdShow)
{WNDCLASSEX ex;HWND hWnd;MSG Msg;//1.设计窗口(最复杂)ex.style = CS_HREDRAW | CS_VREDRAW;ex.cbSize = sizeof(ex);ex.cbClsExtra = 0;ex.cbWndExtra = 0;ex.hInstance = hInstance;ex.hIcon = NULL;ex.hCursor = NULL;ex.hbrBackground = CreateSolidBrush(RGB(0, 255, 0));ex.hIconSm = NULL;ex.lpfnWndProc = MYWNDPROC;ex.lpszMenuName = NULL;ex.lpszClassName = "aaa";//2.注册窗口RegisterClassEx(&ex);//3.创建窗口hWnd = CreateWindow(ex.lpszClassName, "原谅绿", WS_OVERLAPPEDWINDOW, 50, 50, 500, 500, NULL, NULL, hInstance, NULL);//4.显示窗口ShowWindow(hWnd, SW_SHOW);//定时器须在创建窗口之后,消息循环之前SetTimer(hWnd, 1, 500, NULL);//消息循环while (GetMessage(&Msg, NULL, 0, 0)){TranslateMessage(&Msg);DispatchMessage(&Msg);}return 0;
}LRESULT CALLBACK MYWNDPROC(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message) 
{case WM_TIMER:MessageBox(hWnd, "你是不是傻", "服不服", MB_OK);
}
return DefWindowProc(hWnd, message, wParam, lParam);
}

Win32:定时器应用小例

要求:两矩形以不同速度平移,当键盘按下A时快的矩形停止平移,B时另一个矩形停止平移。

#include <windows.h>
#include <stdio.h>LRESULT CALLBACK MYWNDPROC(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevlnstance,LPSTR lpCmdLine,int nCmdShow)
{WNDCLASSEX ex;HWND hWnd;MSG Msg;//1.设计窗口(最复杂)ex.style = CS_HREDRAW | CS_VREDRAW;ex.cbSize = sizeof(ex);ex.cbClsExtra = 0;ex.cbWndExtra = 0;ex.hInstance = hInstance;ex.hIcon = NULL;ex.hCursor = NULL;ex.hbrBackground = CreateSolidBrush(RGB(0, 255, 0));ex.hIconSm = NULL;ex.lpfnWndProc = MYWNDPROC;ex.lpszMenuName = NULL;ex.lpszClassName = "aaa";//2.注册窗口RegisterClassEx(&ex);//3.创建窗口hWnd = CreateWindow(ex.lpszClassName, "原谅绿", WS_OVERLAPPEDWINDOW, 50, 50, 500, 500, NULL, NULL, hInstance, NULL);//4.显示窗口ShowWindow(hWnd, SW_SHOW);//定时器须在创建窗口之后,消息循环之前SetTimer(hWnd, 1, 500, NULL);SetTimer(hWnd, 2, 1000, NULL);//消息循环while (GetMessage(&Msg, NULL, 0, 0)){TranslateMessage(&Msg);DispatchMessage(&Msg);}return 0;
}//要求:两矩形以不同速度平移,当键盘按下A时快的矩形停止平移,B时另一个矩形停止平移。LRESULT CALLBACK MYWNDPROC(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{static int x1 = 50, x2 = 50;HDC hDc;PAINTSTRUCT pS;switch (message){case WM_PAINT:	//重绘消息hDc = BeginPaint(hWnd, &pS);Rectangle(hDc, x1, 100, x1 + 50, 150);Rectangle(hDc, x2, 200, x2 + 50, 250);EndPaint(hWnd, &pS);break;case WM_KEYDOWN:if (65 == wParam) {KillTimer(hWnd, 1);//杀死定时器1}if (66 == wParam) {KillTimer(hWnd, 2);//杀死定时器2}break;case WM_TIMER:hDc = GetDC(hWnd);if (1 == wParam) {x1 += 5;Rectangle(hDc, x1, 100, x1 + 50, 150);}if (2 == wParam) {x2 += 5;Rectangle(hDc, x2, 200, x2 + 50, 250);}ReleaseDC(hWnd, hDc);break;}return DefWindowProc(hWnd, message, wParam, lParam);
}//现象:只有第二个矩形显现,断点调试可以发现,每次ruturn回去时,x1和x2的值均会重新变成50。
//原因:MYWNDPROC是头文件写好的死循环函数,因此每次循环进消息处理函数都将定义x1=50,而上一次的x1=50+5=55,作为局部变量在上一个循环函数结束时已经被回收。
//处理方式,将int x1前加上一个static(静态修饰符),static变量能保持上次调用后的结果,int在函数返回后就销毁了,下次调用又重新建立。

Win32:贴图

#include <windows.h>
#include <stdio.h>
#include "resource.h"LRESULT CALLBACK MYWNDPROC(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);//定义位图句柄
HBITMAP hBitmap_Background;
HBITMAP hBitmap_Apple;
HBITMAP hBitmap_SnakeBody;
HBITMAP hBitmap_SnakeHead_Up;
HBITMAP hBitmap_SnakeHead_Down;
HBITMAP hBitmap_SnakeHead_Left;
HBITMAP hBitmap_SnakeHead_Right;void ShowBackground(HDC hDc);int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevlnstance,LPSTR lpCmdLine,int nCmdShow)
{WNDCLASSEX ex;HWND hWnd;MSG Msg;//加载位图hBitmap_Background = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));//LoadBitmap(当前应用实例句柄, 位图路径),位图路径在导入图片时已经自动宏定义了,利用MAKEINTRESOURCE函数即可得到路径//加载失败时会返回NULL,可下断点查看hBitmap_Background的值来判断是否加载成功hBitmap_Apple = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP2));hBitmap_SnakeBody = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP3));hBitmap_SnakeHead_Up = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP5));hBitmap_SnakeHead_Down = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP7));hBitmap_SnakeHead_Left = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP6));hBitmap_SnakeHead_Right = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP4));//1.设计窗口(最复杂)ex.style = CS_HREDRAW | CS_VREDRAW;ex.cbSize = sizeof(ex);ex.cbClsExtra = 0;ex.cbWndExtra = 0;ex.hInstance = hInstance;ex.hIcon = NULL;ex.hCursor = NULL;ex.hbrBackground = CreateSolidBrush(RGB(0, 255, 0));ex.hIconSm = NULL;ex.lpfnWndProc = MYWNDPROC;ex.lpszMenuName = NULL;ex.lpszClassName = "aaa";//2.注册窗口RegisterClassEx(&ex);//3.创建窗口hWnd = CreateWindow(ex.lpszClassName, "贪吃蛇", WS_OVERLAPPEDWINDOW, 50, 50, 615, 638, NULL, NULL, hInstance, NULL);//4.显示窗口ShowWindow(hWnd, SW_SHOW);//消息循环while (GetMessage(&Msg, NULL, 0, 0)){TranslateMessage(&Msg);DispatchMessage(&Msg);}return 0;
}LRESULT CALLBACK MYWNDPROC(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC hDc;PAINTSTRUCT pS;switch (message){case WM_CLOSE:	//关闭消息PostQuitMessage(0);break;case WM_PAINT:	//重绘消息hDc = BeginPaint(hWnd, &pS);//显示背景ShowBackground(hDc);EndPaint(hWnd, &pS);break;}return DefWindowProc(hWnd, message, wParam, lParam);
}void ShowBackground(HDC hDc)
{//1.创建兼容性DCHDC hDcmen = CreateCompatibleDC(hDc);//2.给兼容性DC关联一张位图SelectObject(hDcmen, hBitmap_Background);//3.传输BitBlt(hDc, 0, 0, 600, 600, hDcmen, 0, 0, SRCCOPY);//4.删除兼容性DCDeleteDC(hDcmen);
}

本文发布于:2024-01-29 04:45:35,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170647473812789.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:学习笔记   语言
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23