你需要计算被删除字符所在的区域(CRect),并使用InvalidateRect函数刷新这个区域来清除区域;
根据你当前代码,并不能保证在一行的中间删除和中间插入可以正常(这需要更多计算和处理),另外,也不能保证窗口最小化(或被遮盖)后重新显示可以正常(尤其多行)。
其实在视图中处理文本,应该使用CEditView更方便,使用标准CView基类,太多事情需要自己处理了,不划算。
voidc**view::oninitialupdate()
{
cformview::oninitialupdate()
/*
加入你要的初始化代码*/
getparentframe()->recalclayout()
resizeparenttofit()
}
在cformview中,通过跟踪可发现程序不会去调用cdialog::oninitdialog(),在cformview::create(**)中有如下语句createdlg(m_lpsztemplatename,
pparentwnd),既对话框通过非模态创建,创建期间会发送wm_create消息,但初始化代码不能写在oncreate函数里面,因为此时对话框还没创建完毕,在所有的创建工作结束后,既cformview::create(**)执行完毕后系统会调用oninitialupdate(),这时候就可以加入你的初始化代码了
// 打字母游戏#include <graphics.h>
#include <conio.h>
#include <time.h>
// 欢迎界面
void welcome()
{
// 输出屏幕提示
cleardevice()
setcolor(YELLOW)
setfont(64, 0, "黑体")
outtextxy(160, 50, "打字母游戏")
setcolor(WHITE)
setfont(16, 0, "宋体")
outtextxy(100, 200, "就是很传统的那个掉字母然后按相应键就消失的游戏")
outtextxy(100, 240, "只是做了一个简单的实现")
outtextxy(100, 280, "功能并不很完善,比如生命数、分数等都没有写")
outtextxy(100, 320, "感兴趣的自己加进去吧")
// 实现闪烁的“按任意键继续”
int c=255
while(!kbhit())
{
setcolor(RGB(c, 0, 0))
outtextxy(280, 400, "按任意键继续")
c -= 8
if (c <0) c = 255
Sleep(20)
}
getch()
cleardevice()
}
// 退出界面
void goodbye()
{
cleardevice()
setcolor(YELLOW)
setfont(48, 0, "黑体")
outtextxy(104, 180, "多写程序 不老青春")
getch()
}
// 主函数
void main()
{
initgraph(640, 480) // 初始化屏幕为 640x480
welcome()// 显示欢迎界面
srand(time(NULL)) // 设置随机种子
setfont(16, 0, "Arial")// 设置字母的字体和大小
setfillstyle(BLACK) // 设置清除字母的填充区域颜色
char target // 目标字母
char key// 用户的按键
int x, y// 字母的位置
// 主循环
while(true)
{
target = 65 + rand() % 26 // 产生任意大写字母
x = rand() % 620 // 产生任意下落位置
for (y=0y<460y++)
{
setcolor(WHITE) // 设置字母的颜色
outtextxy(x, y, target)// 显示字母
if(kbhit())
{
key = getch() // 获取用户按键
if((key == target) || (key == target + 32))
{
// 按键正确,“击落”字母(画黑色方块擦除)
bar(x, y, x + 16, y + 16)
break // 跳出循环,进行下一个字母
}
else if (key == 27)
{
goto EXIT // 如果按 ESC,退出游戏主循环
}
}
// 延时,并清除字母
Sleep(10)
bar(x, y, x + 16, y + 16)
}
}
EXIT:
// 退出部分
goodbye()
// 关闭图形界面
closegraph()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)