学习windows编程 day6 之模拟记事本
//短的函数最好定义为宏
#define BUFFER(x,y) *(y*cxBuffer+x+pBuffer)//取出一个字符 //字符消息
//WM_CHAR,WM_DEADCHAR,WM_SYSCHAR,WM_SYSDEADCHAR
//前两个是由WM_KEYDOWN/UP消息产生,后两个是由WM_SYSKEYDOWN/UP消息产生
//DEADCHAR是某些国家字母有符号,多种表现形式。有DEADCHAR会组合更多,但是我们有不到这个 //消息参数
//wParam:指定该按键的虚拟键代码
//在下面两种消息中的含义
//----WM_KEYDOWN:虚拟键代码 key
//----WM_CHAR:ANSI或Unicode字符码(看宏定义区别) char //lParam
//扩展键标记(手册) //消息排序 假设按下A键并释放,大写状态关闭
//1.WM_KEYDOWN 'A'的虚拟按键代码0x41 无论大小写都是大写的按键代码,区别在WM_CHAR处
//2.WM_CHAR 'a'的虚拟按键代码0x61
//3.WM_KEYUP 'A'的虚拟按键代码0x41 //若是持续按下‘A'键
//会循环1、2步骤,在抬起时走3 //插入符号 一个程序共享一个插入符号 获得焦点(活动窗口) 响应WM_SETFOCUS WM_KILLFOCUS
//createcaret,setcaretpos,showcaret,hidecaret.destroycaret LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
RECT rect; PAINTSTRUCT ps;
TEXTMETRIC tm; static int cxClient, cyClient; //客户区大小
static int cxChar, cyChar; //字体大小
static int cxCaret, cyCaret; //插入符位置
static int cxBuffer, cyBuffer; //列数行数
static TCHAR * pBuffer = NULL; int x, y, i;//用于循环使用 switch (message)
{
case WM_CREATE:
//获取字体大小
hdc = GetDC(hwnd);
//系统默认等宽字体
SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight + tm.tmExternalLeading; ReleaseDC(hwnd, hdc);
break;
case WM_SIZE:
//获取屏幕大小
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
//获取行数和列数
cxBuffer = (int)cxClient / cxChar;
cyBuffer = (int)cyClient / cyChar;
cxBuffer = max(, cxBuffer);
cyBuffer = max(, cyBuffer); //设置字符集指针的大小
if (pBuffer!=NULL)
{
free(pBuffer);
} pBuffer = (TCHAR *)malloc(cxBuffer*cyBuffer*sizeof(TCHAR)); //初始化这个空间
for (y = ; y < cyBuffer; y++)
{
for (x = ; x < cxBuffer; x++)
{
BUFFER(x,y) = ' ';
}
} //设置光标位置,左上角
cxCaret = ;
cyCaret = ; if (hwnd==GetFocus())
{
SetCaretPos(cxCaret*cxChar, cyCaret*cyChar);
//设为0,0处,先不需要显示
}
InvalidateRect(hwnd, NULL, TRUE);
break;
case WM_SETFOCUS:
CreateCaret(hwnd, NULL, cxChar, cyChar);
SetCaretPos(cxCaret*cxChar, cyCaret*cyChar);//左上角
ShowCaret(hwnd);
break;
case WM_KILLFOCUS:
HideCaret(hwnd);
DestroyCaret();
break;
case WM_KEYDOWN:
switch (wParam)
{
case VK_DOWN:
cyCaret += ;
break;
case VK_UP:
cyCaret -= ;
break;
case VK_LEFT:
cxCaret -= ;
break;
case VK_RIGHT:
cxCaret += ;
break;
case VK_DELETE:
for (x = cxCaret; x < cxBuffer - ;x++)
{
BUFFER(x, cyCaret) = BUFFER(x + , cyCaret);
}
BUFFER(cxBuffer - , cyCaret) = ' ';
HideCaret(hwnd);
hdc = GetDC(hwnd);
TextOut(hdc, , cyCaret*cyChar, &BUFFER(, cyCaret), cxBuffer);//重绘这一行
ReleaseDC(hwnd, hdc);
ShowCaret(hwnd);
default:
break;
}
cxCaret = max(, cxCaret);
cyCaret = max(, cyCaret);
cxCaret = min(cxCaret, cxBuffer - );
cyCaret = min(cyCaret, cyBuffer - ); SetCaretPos(cxCaret*cxChar, cyCaret*cyChar);
break;
case WM_CHAR:
for (i = ; i < (int)LOWORD(lParam);i++)//用户按键过快时
{
switch (wParam)
{
case '\b':
if (cxCaret>)
{
cxCaret--;
SendMessage(hwnd, WM_KEYDOWN, VK_DELETE, );
}
break;
default:
BUFFER(cxCaret, cyCaret) = (TCHAR)wParam;
hdc = GetDC(hwnd);
//先隐藏光标
HideCaret(hwnd); TextOut(hdc, cxCaret*cxChar, cyCaret*cyChar, &BUFFER(cxCaret, cyCaret), );
if (++cxCaret == cxBuffer)
{
cxCaret = ;
if (++cyCaret == cyBuffer)
{
cyCaret = ;
}
} //显示光标
ShowCaret(hwnd);
ReleaseDC(hwnd, hdc);
}
}
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect); for (y = ; y < cyBuffer;y++)
{
TextOut(hdc, , y*cyChar, &pBuffer[y*cxBuffer], cxBuffer);
} EndPaint(hwnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage();
return ;
} return DefWindowProc(hwnd, message, wParam, lParam);
}
学习windows编程 day6 之模拟记事本的更多相关文章
- 学习windows编程 day6 之处理鼠标移动
#define POINT_MAX 1000 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPara ...
- 有一定基础的 C++ 学习者该怎样学习 Windows 编程?
人的心理有个奇异的特性:一项知识一旦学会之后,学习过程中面临的困惑和不解非常快就会忘得干干净净,似乎一切都是自然而然,本来就该这种.因此,关于「怎样入门」这类问题,找顶尖高手来回答,未必能比一个刚入门 ...
- 我为什么学习Windows编程
前一段时间在看TCP/IP,在图书馆里面找了不少的书,其中有几本书还是不错的.比如: <Windows网络与通信程序设计(第二版)> 王艳平著 <WinSock网络编程经络> ...
- 学习windows编程 day2 之滚动条使用
相关函数: setscrollrange,setscrollpos,getscrollrange,getscrollpos 使用滚动条时我们需要进行的操作: 1.初始化滚动条范围和位置 在窗口创建时W ...
- 学习windows编程 day1
#include <windows.h> #include <strsafe.h> /* 任务:去掉标题栏和边框 */ //#define LineHeight 15 这是自己 ...
- 学习windows编程 day4 之 绘制随机矩形和peekMessage
#include <windows.h> #include <strsafe.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT messa ...
- 学习windows编程 day4 之 自定义映射
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRU ...
- 学习windows编程 day4 之视口和窗口
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRU ...
- 学习windows编程 day4 之 盯裆猫
写着写着就困了.... 看这些测量数据就算了,是对各种函数的练习 #include <windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT ...
随机推荐
- 《Multiplayer Game Programming》阅读笔记
在图书馆发现一本<网络多人游戏架构与编程>-- Joshua Glazer, Sanjay Madhav 著.书挺新的,17年出版的,内容很有趣,翻一翻可以学到不少在<计算机网络&g ...
- [2017BUAA软工]第零次博客作业
第一部分:结缘计算机 1. 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?(必答) 当年高考前在专业这件事上纠结了好久,因为我对于大学各个专业具体学什么都不甚了解,于是就迟迟没有明确的目 ...
- VSCODE安装以及使用Python运行调试代码的简单记录
1. VScode安装 官网下载VSCODE https://code.visualstudio.com/ 下载呢windows的x64安装包,安装stable的版本 当前日期 2018.01.15 ...
- SQLSERVER备份恢复后权限问题简单处理.
1. 同事的服务器出现无法访问表, 应用连不上数据库... 远程了下 发现. 使用业务用户登录数据库之后查询无法下拉帮助到表, 必须增加schemas才可以访问到具体的表. 2. 问题解决. 1. 修 ...
- 设计模式之抽象工厂模式(附带类似反射功能的实现/c++)
问题描述 假设我们要开发一款游戏, 当然为了吸引更多的人玩, 游戏难度不能太大(让大家都没有信心了,估计游戏也就没有前途了),但是也不能太简单(没有挑战性也不符合玩家的心理).于是我们就可以采用这样一 ...
- array与List之间相互转化
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/5/28 16:05 # @Author : zhang chao # @Fi ...
- python之random函数
# random各种使用方法 import random # 随机生成[0.1)的浮点数 print("random():", random.random()) # 随机生成100 ...
- 洛谷P4088 [USACO18FEB]Slingshot
题面 大意:给出n个弹弓,可以用ti的时间把xi位置运到yi,在给出m组询问,求xj到yj最小时间. sol:首先如果不用弹弓,时间应为abs(xj-yj).否则时间就是abs(xi-xj)+abs( ...
- POJ3176-基础DP
很基础的dp题.有一头奶牛想接尽量多的苹果,有w此移动机会. dp[i][w] = max(dp[i-1][w+1] + 能否吃到苹果 ,dp[i-1][w] + 能否吃到苹果) //从上一分钟是否 ...
- MT【8】和e有关的一个极限
解答: 评:这里涉及到e有关的极限的单调性,求导数得: