智能终端定制开发 ad
MTK/瑞芯微/高通-Android,智能模块/智能终端方案商

深度定制各类智能终端和智能硬件产品,提供硬件选型咨询、参考设计、元器件推荐、驱动开发、行业模块集成、操作系统定制与算法集成等软硬件定制服务。
contact.aspx

Android核心板产品覆盖2G、3G、4G通讯,双核、四核、八核CPU,可选的平台有MTK6580、MTK6737、MTK6750等,Android版本有5.1 6.0 7.0等。
contact.aspx

可广泛应用于低端智能POS、安防监控、车载设备、低端智能机器人、智能家居、智能硬件、工业智能手持设备、低端智能对讲设备、低端警务或执法设备、智能穿戴、贩卖机、物流柜、智能门禁系统等行业和设备。
contact.aspx

可提供以太网转串口透传,WIFI转串口透传,蓝牙转串口透传,CAN总线模拟量控制输出模块等。
contact.aspx

带3G或4G通讯功能,运行android系统,有多个串口,可以外挂各种模块:条码扫描、RFID、指纹识别、身份证识别、磁条卡、ID卡、GPS/北斗模块等。
contact.aspx

具有4G通讯功能,多个RS232或RS485接口,以太网接口,USB接口,CAN接口,多个AD输入。基于Android系统智能平台,方便APP应用开发。器件严格选型,运行稳定,质量可靠。
contact.aspx

QQ2006 界面编程之鸡蛋里挑骨头
[VC 编程] 2008-04-03



作者:韩山师范学院02届 黄锐坤

下载源代码

  2007新的一年即将来临,新版本的QQ估计也要跟我们相见。在此献上本人写于8月份的一个练习程序。主要是希望腾讯做界面的同志能否把创建异形窗体函数 SetWindowRgn 放到合适的位置,别让拖动窗体改变大小时出现用做 MASK 的紫色区域;再者与大家分享不指定窗体风格 WS_THICKFRAME(对于对话框,相当指定其属性 Border 为 Resizing ),用代码实现窗体拖放,任意改变其尺寸。

一、SetWindowRgn的合适位置

1、在void C**Dlg::OnPaint()里调用SetWindowRgn
可以在内存画图完毕准备显示到屏幕前调用,如下:

void C**Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); ... } else { CPaintDC dc(this); // 用于绘制的设备上下文 CRect rcClient; GetClientRect(&rcClient); //构造内存DC,用于画图 CDC m_MemDC; m_MemDC.CreateCompatibleDC(&dc); CBitmap btScreen; btScreen.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height()); m_MemDC.SelectObject(&btScreen); btScreen.DeleteObject(); //这里画图 ... //创建不规则窗体 ChangeWindowRgn(&m_MemDC);//这里面调用了SetWindowRgn //画到显示器上 dc.BitBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), &m_MemDC, 0, 0, SRCCOPY); m_MemDC.DeleteDC(); } } void C**Dlg::ChangeWindowRgn(CDC *pDC) { COLORREF col = RGB(255,0,255); CRect rcClient; GetClientRect (rcClient); CRgn rgn; rgn.CreateRectRgn (0, 0, rcClient.Width(), rcClient.Height()); ... SetWindowRgn (rgn, TRUE); }
2、在void C**Dlg::OnShowWindow()里调用SetWindowRgn, 如下:
void C**Dlg::OnShowWindow(BOOL bShow, UINT nStatus) { CWnd::OnShowWindow(bShow, nStatus); // TODO: 在此处添加消息处理程序代码 if(bShow) { CRect rc; this->GetClientRect(&rc); CRgn rgnMain; rgnMain.CreateRoundRectRgn(0, 0, rcClient.Width(), rcClient.Height()); ... SetWindowRgn( rgnMain, TRUE ); } }
二、手动做“Resizing对话框”

该思路启发于徐景周的精灵特效窗体。要想点击窗体客户区不放能移动窗体,传统的做法是模拟消息点击标题。

void C**Dlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码 PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,0); CDialog::OnLButtonDown(nFlags, point); }
  这样很方便实现效果。但不足是窗体被移到屏幕上方,大部分在屏幕所能显示以外以后放开鼠标,窗体会自动向下对齐。徐景周的精灵特效窗体用了SetTimer和MoveWindow结合使用,这样窗体想被移到哪里都可以。正因为如此,让我想到拖放窗体的好思路。当然我们完全可以利用窗体风格WS_THICKFRAME,让系统来为我们做事。
  但是如果我们要指定窗体某个部位可以拖放窗体时,像QQ切换主题后,拖放很不方便。可以拖放的区域不是最左,最右,最上,最下,没有别的地方可以点击拖放窗体了。
  如何实现,简单说就是在鼠标按下时判断是否点在规定区域内,是的话启动记时器。然后在记时器里面定时器里面对光标判断当前位置与之前位置,从而调用MoveWindow让窗体朝响应方向拉伸或收缩。代码较琐碎,请见例子。
void C**Dlg::OnLButtonDown(UINT nFlags, CPoint point) { CRect rc(*,*,*,*); if(rc.PtInRect(point)) { SetTimer(1,20,NULL);//启动记时器 return; } CDialog::OnLButtonDown(nFlags, point); } void C**Dlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 switch(nIDEvent) { case(1): { CRect rcW; POINT point; GetWindowRect(rcW);// //实现拖动时窗体跟着右下角拉伸 ::GetCursorPos(&point); //得到“当前位置” if(point.y<rcW.bottom-400) { MoveWindow(m_rcCurRect.left ,point.y-m_ptCurPoint.y, rcW.Width(), m_rcCurRect.bottom-(point.y-m_ptCurPoint.y), true); CRect rc; GetWindowRect(rc); m_rcCurRect = rc;//保存“之前位置” } Invalidate(); } break; ... Default: break; } Dialog::OnTimer(nIDEvent); }
代码在Visual2005下编译,在WindowXP运行通过。 预览图如下:


    预览图

[VC 编程添加评论 | 评论/阅读(0/231)
评论
昵称
主页
内容
递交


Copyright @ 我的开发笔记     2008 - 2017         粤ICP备19155526号-1