当前位置:恩施知识网 > 情感人生 > 正文

vc输出窗口一闪而过,c语言光标闪烁怎么解决

作者:古典小说网 (gudianxiaoshuo.com)
头条:讨厌编程 、 古典古韵古典小说
作品:快乐课堂软件、任性动图软件、古典小说大全任性动图V9.0版本发布了,之前面试的时候,向面试官演示过这个软件。面试官看到的往往是不足,果然,没有问我研究的重点,而是其它没有关注的东西,比如光标闪烁,以前没时间解决,现在,核心的都做完了,于是,就着手解决这个问题。
当时面试官,提出这个问题时,我还真没注意过,就说不知道,没研究过,结果被鄙视了,他说他们可以实现。
好吧

作者:古典小说网 (gudianxiaoshuo.com)

头条:讨厌编程 、 古典古韵古典小说

作品:快乐课堂软件、任性动图软件、古典小说大全

任性动图V9.0版本发布了,之前面试的时候,向面试官演示过这个软件。

面试官看到的往往是不足,果然,没有问我研究的重点,而是其它没有关注的东西,比如光标闪烁,以前没时间解决,现在,核心的都做完了,于是,就着手解决这个问题。

当时面试官,提出这个问题时,我还真没注意过,就说不知道,没研究过,结果被鄙视了,他说他们可以实现。

好吧,我之前没研究过,不知道为什么,面试的都说找熟练的,我无法熟练,只是有了问题,便去解决这个问题。解决完了,过了一段时间就忘了。

今天,就解决下这个光标闪烁的问题。

为什么会闪烁

原因:鼠标移动过程中,会设置为默认的光标,这样你自己设置的光标,和默认光标来回切换,就造成了闪烁

方法:

1、重载CWnd::PreCreateWindow()函数注册自己的要改变鼠标指针的窗口类。

PreCreateWindow(CREATESTRUCT& cs){// 创建自己的窗口类,窗口不设置光标,以便根据需要进行设置if (cs.lpszClass == NULL)cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS);return CScrollView::PreCreateWindow(cs);}

2 定义所需的光标

HCURSOR hCursorArrow;HCURSOR hCursorXiGuan;HCURSOR hCursorXuanzhuan;HCURSOR hCursorShensuo;HCURSOR hCursorNS;HCURSOR hCursorWE;HCURSOR hCursorTuceng;HCURSOR hCursorMove;HCURSOR hCurrentCursor; //所用的当前光标

加载光标

LoadCursorEx(){hCursorArrow =LoadCursor(NULL, IDC_ARROW);hCursorXiGuan = AfxGetApp()->LoadCursor(IDC_XIGUAN);hCursorXuanzhuan = AfxGetApp()->LoadCursor(IDC_XUANZHUAN);hCursorShensuo = AfxGetApp()->LoadCursor(IDC_SHENSUO);hCursorNS = LoadCursor(NULL, IDC_SIZENS);hCursorWE = LoadCursor(NULL, IDC_SIZEWE);hCursorTuceng = AfxGetApp()->LoadCursor(IDC_TUCENG);hCursorMove = AfxGetApp()->LoadCursor(IDC_MOVE);//LoadCursor(NULL, IDC_CROSS);//}

重载 SetCursor

SetCursor(HCURSOR hc){if (hc != hCurrentCursor)::SetCursor(hc);hCurrentCursor = hc;}

初始化

OnInitialUpdate(){CScrollView::OnInitialUpdate();//bExit = FALSE;LoadCursorEx();SetCursor(hCursorArrow); //加载光标,设置当前光标

在合适的地方,设置为其它光标就可以了

比如,移动时,设置为

SetCursor(hCursorMove);

使用时,要注意,你自己设置的光标不要频繁切换,否则,也会出现闪烁现象。

vc输出窗口一闪而过,c语言光标闪烁怎么解决

c语言 光标 闪烁

#include
void
hidecursor()
{
console_cursor_info
cursor_info
=
{1,
0};
setconsolecursorinfo(getstdhandle(std_output_handle),
&cursor_info);
}
函数和结构体都在windows.h中定义,函数用法简单就不说了。
console_cursor_info结构体定义如下:
typedef
struct
{
dword
dwsize;
bool
bvisible;
//为0时光标不可见
}console_cursor_info,
*pconsole_cursor_info;
vc,mingw中均没问题。
不明白直接hi。

vc输出窗口一闪而过,c语言光标闪烁怎么解决

如何解决vc++绘图出现屏幕闪烁的问题

相信很多人在做图形界面开发时,常常会遇到屏幕闪烁的情况,当然我也不例外。前段时间用vc++做了一个小游戏——五子棋,前期阶段主要做的是逻辑层面的编码,没有太注意屏幕闪烁的情况,到了后来实现悔棋功能时需要擦除已下过的棋子进行重绘,屏幕闪烁厉害,急需解决——有哪个玩家愿意玩屏幕老闪烁的游戏? 通常来说程序根据需要调用Invalidate(FALSE)使窗口客户区无效引起重绘,然后在窗口OnPaint函数(基于文档视图的程序则是OnDraw)中进行稳定绘图就行了。但是,我们在OnPaint中进行多重绘制(画背景、棋盘、棋子等),前后绘制的反差造成了闪烁现象。以前知道Java中解决屏幕闪烁问题是用双缓冲的方法,现在发现在vc++中也是可以这么做的。简单来说,双缓冲就是先把需要绘制的东西全部一口气画在内存中,最后把内存中的数据搬到屏幕上显示。
下面是双缓冲的代码实现例子:
点击(此处)折叠或打开
void C****Dlg::OnPaint()
{
if (IsIconic())
{
//......
}
else
{
//CDialog::OnPaint(); //不要调用这个
CPaintDC dc(this);//对话框的dc//通常CPaintDC用来响应WM_PAINT消息。
//CPaintDC是从CDC派生出来的:在构造时自动调用CWnd::BeginPaint,析构时调用CWnd::EndPaint。
RECT rect;// 客户区矩形
GetClientRect(&rect);
// 使用双缓冲避免屏幕刷新时闪烁
CDC dcMem;// 内存dc
CBitmap bmpMem; // 位图
dcMem.CreateCompatibleDC(NULL);// 创建兼容dc
bmpMem.CreateCompatibleBitmap(&dc, rect.right-rect.left, rect.bottom-rect.top);//创建跟客户区域大小一样的(空)位图
// 把位图选到设备上下文环境中
CBitmap *pOld = dcMem.SelectObject(&bmpMem);
// dcMem.FillSolidRect(&rect, RGB(255,255,255));
// 在此处将绘制内容全画到dcMem内存中,(即把之前使用CPaintDC绘制的dc换成dcMem即可)
DrawTable(dcMem);//画棋盘
DrawChesses(dcMem); // 画棋子
//......
// 至此,内存中绘图完毕
// 从内存拷贝到设备dc
dc.BitBlt(0, 0, rect.right - rect.left, rect.bottom - rect.top, &dcMem, 0, 0, SRCCOPY);
dc.SelectObject(pOld);
// 释放资源
bmpMem.DeleteObject();
dcMem.DeleteDC();
}
}
PS:屏幕闪烁问题虽然得到解决了,但是窗口上的按钮却还会闪(可能是因为使用图片按钮的缘故才那么明显),当然这个我也是无法容忍的。
默认情况窗口风格没有设置了WS_CLIPCHILDREN属性,所以父窗口刷新时子窗口也跟着刷新,于是产生按钮闪烁现象,于是我在游戏开始时给窗口加上WS_CLIPCHILDREN属性:
ModifyStyle(0, WS_CLIPCHILDREN);
这样Invalidate 时按钮就不会闪烁了。
如果窗口加上了WS_CLIPCHILDREN属性,当需要切换背景图片时,按钮因为没有刷新所以会被盖住,直到(鼠标移到按钮上)重绘时才会显示出来。
解决方法:
1)添加BOOL类型的成员变量bgroundChanged,初始化为FALSE;
2)在切换背景图片前调用ModifyStyle(WS_CLIPCHILDREN, 0)去掉WS_CLIPCHILDREN属性,并把bgroundChanged设置为TRUE;
3)在OnPaint中最后增加
if (TRUE == bgroundChanged)
{
bgroundChg = FALSE;
ModifyStyle(0, WS_CLIPCHILDREN);
}
免责申明:以上内容属作者个人观点,版权归原作者所有,不代表恩施知识网立场!登载此文只为提供信息参考,并不用于任何商业目的。如有侵权或内容不符,请联系我们处理,谢谢合作!
当前文章地址:https://www.esly.wang/qinggang/52586.html 感谢你把文章分享给有需要的朋友!
上一篇:镀金元器件除金的相关工艺深圳市同远表面处理有限公司 下一篇:excel表格里实时更新日期的公式,excel自动更新当天数据

文章评论