MFC学习笔记
发布日期:2021-07-29 11:00:13 浏览次数:3 分类:技术文章

本文共 4084 字,大约阅读时间需要 13 分钟。

  • 通过theApp获得主窗口句柄

在任何文件中如何通过theApp获得主窗口的控件,并响应其消息函数

例:

extern CxxxApp theApp
theApp.m_pMainWnd
-
>SendDlgItemMessage(IDC_INPUT_OK,WM_LBUTTONDOWN,NULL,NULL);
theApp.m_pMainWnd
-
>SendDlgItemMessage(IDC_INPUT_OK,WM_LBUTTONUP,NULL,NULL);

以上是对主窗口的IDC_INPUT_OK控件发送单击命令。

  • MFC中RadioButton组回调函数使用

在面板中Ctrl+D设置RadioButton分组,将每组第一个Group属性设为True,设置一个变量关联每个组(控件变量选变量值),对变量赋值UpData(TRUE)传输到面板...

Group Radio Button 响应函数:给第一个添加响应后,将ON_BN_CLICKED(IDC_RADIO1,OnRadio)改为ON_CONTROL_RANGE(BN_CLICKED,IDC_RADIO1,IDC_RADIO10,OnRadio) 此处有10个Radio为一组

  • CComBSTR和char*相互转换
char
*IP;
CComBSTR IoResource
=
"L102";
IP
=_com_util
:
:ConvertBSTRToString(IoResource);
IoResource=_com_util::ConvertStringToBSTR(IP);
  • MessageBox使用
try{
    ...
}
catch (_com_error
& e)
 {
        
:
:MessageBox(NULL, e.Description(), e.ErrorMessage(), MB_ICONERROR);
}
MessageBox(L
"生成会话工厂实例发生错误!",L
"错误",MB_ICONERROR);
 
  • 创建线程
HANDLE pt
=CreateThread(NULL,
0,Thread_Proc,(LPVOID)
&Lxi102channel[n],
0,NULL);
CloseHandle(pt);
 
  • 自定义延时函数
void MyDelay(
int n)
{
    
int dwStart
=
0;
    
int dwEnd
=
0;
    
do 
    {
        MSG msg;
        GetMessage(
&msg,NULL,
0,
0);
        TranslateMessage(
&msg);
        DispatchMessage(
&msg);
        dwEnd
=GetTickCount()
-dwStart;
    }
while(dwEnd
<n);
}
 
  • 常用字符串操作函数
strcpy(
char
*_Dest,
const
char
* _Source);
strcpy_s(
char
*_Dest,size_t _SizeInBytes,
const
char
* _Source);
wcscpy_s(WCHAR
*_Dest,size_t _SizeInWords,
const WCHAR
*_Source);
swscanf_s(inputDate,L
"%d:%d:%d",
&hh,
&mm,
&ss);
sscanf_s(rawDate,
"%d/%d/%d %d:%d:%d",
&year,
&month,
&day,
&hour,
&minute,
&second);
wsprintf(wstr1,L
"正在进行通道%d等待源设置...",number);
swprintf_s(inputDate,L
"%d:%d:%d",hh,mm,ss);
sprintf_s(scpi_send,SCPI_SEND_LENGTH,
"MEASure:%s(@%d,@%d)\n",measureSwitchStr[measureSwitch],channel1,channel2);
 
  • CDC画图
int m_left;
int m_top ;
int m_right; 
int m_bottom;
CDC
*pDC;
CPen pPenRed;
CPen pPenWhite;
CRect drawrect;
CWnd
* pWnd;
pWnd
= GetDlgItem(IDC_DRAW);
//IDC_DRAW为图形控件(也可以是STATIC控件?)
pWnd
-
>GetClientRect(
&drawrect);
//获得画图矩形区
pDC
= pWnd
-
>GetDC();    
pWnd
-
>Invalidate();
pWnd
-
>UpdateWindow();
pDC
-
>Rectangle(
&drawrect);
m_left
= drawrect.left
+
25;
m_top
= drawrect.top
+
5;
m_right
= drawrect.right
-
10;
m_bottom
= drawrect.bottom
-
25;
// 红色画笔
pPenRed.CreatePen(PS_DASHDOTDOT,
1,RGB(
255,
0,
0));
//白色画笔
pPenWhite.CreatePen(PS_SOLID,
1,RGB(
255,
255,
255));
//画一条对角线
pDC
-
>FillSolidRect(
&drawrect, RGB(
0,
0,
0));
//背景黑色
pDC
-
>SelectObject(
&pPenRed);
//使用红笔
pDC
-
>SetTextColor(RGB(
0,
255,
0));
//绿色字体
pDC
-
>MoveTo(m_left,m_bottom);
//线条起点
pDC
-
>LineTo(m_right,m_top);
//线条终点
pDC
-
>TextOut(m_left
+
15,m_bottom
+
3,L
"Hello");
//指定坐标写字
 
  • CDC画图移动窗口图形消失解决办法
重载窗口OnPaint()函数
如:
void TSER
:
:OnPaint()
{
    CPaintDC dc(
this);
// device context for painting
    
// TODO: Add your message handler code here
    
// Do not call CDialog::OnPaint() for painting messages
    DrawBackGround();
    DrawWave();
}
  • VARIANT数据存储与读取
void getValue(VARIANT
*getVal)
{
    
//返回数组格式为//时间 通道1至16数据
    
/[t0, y1_0 ~ y16_0,
    
//t1, y1_1 ~ y16_1,
    
//t2, y1_2 ~ y16_2,
    
//t3, y1_3 ~ y16_3,
    
//................]
    
/ 返回数据初始化,如果读取数据正常,则返回读取数据,否则返回下列数据
    SAFEARRAY FAR
* psa;
    SAFEARRAYBOUND rgsabound[
1];
    rgsabound[
0].lLbound
=
0;
    rgsabound[
0].cElements
=
20
*
17;
    
long idx
=
0;
    psa
=SafeArrayCreate(VT_I4,
1,rgsabound);
    
for (
unsigned
int n
=rgsabound[
0].lLbound;n
<rgsabound[
0].cElements;n
++)
    {
        readData
=((n
%
17)
==
0)
?(n
*
10)
:(
0);
        idx
=(
long)n;
        SafeArrayPutElement(psa,
&idx,
&readData);
    }
    V_VT(getVal)
= VT_ARRAY
| VT_I4;
    V_ARRAY(getVal)
=psa;
    
/
}
void FormateVariantToDatas()
{
    
unsigned
int xdata[
1024];
    
unsigned
int ydata[
16][
1024];
    VARIANT V_getValue;
    getValue(
&V_getValue);
    
long dim
=SafeArrayGetDim(V_getValue.parray);
    
long ubound;
    
long lbound;
    SafeArrayGetUBound(V_getValue.parray,dim,
&ubound);
    SafeArrayGetLBound(V_getValue.parray,dim,
&lbound);
    
long index
=
0;
    
unsigned
int tempn
=
0;
    
unsigned
int tempnmode
=
0;
    
long    readData;
    
for (
long index
=
0;index
<
=ubound;index
++)
    {
        tempn
=(
unsigned
int)index
/
17;
        tempnmode
=(
unsigned
int)(index
%
17);
        SafeArrayGetElement(V_getValue.parray,
&index,
&readData);
        
if (tempnmode
==
0)
        {
            xdata[tempn]
=readData;
        }
        
else
        {
            ydata[tempnmode
-
1][tempn]
=readData;
        }
    }
}

转载地址:https://blog.csdn.net/thq0201/article/details/7786613 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:windows程序及MFC简介
下一篇:嵌入式系统vxworks

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月15日 06时07分30秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

spring boot 与 Ant Design of Vue 鉴权体系获取用户信息的实现(三十二) 2019-04-27
Druid连接池实现自定义场景的多数据库的连接 2019-04-27
CentOs7命令行(静默)的方式安装oracle数据库 2019-04-27
基于VMware安装CentOs7的镜像 2019-04-27
PL/SQL数据库管理工具的使用 2019-04-27
史上最简单的spring-boot集成websocket的实现方式 2019-04-27
带你玩转属于自己的spring-boot-starter系列(一) 2019-04-27
带你玩转属于自己自己的spring-boot-starter系列(二) 2019-04-27
带你玩转属于自己的spring-boot-starter系列(三) 2019-04-27
基于SnowFlake算法如何让分库分表中不同的ID落在同一个库的算法的实现 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之分库解决方案(二) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之分表解决方案(一) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之关联查询解决方案(三) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之基于seata的分布式事务的解决方案(十五) 2019-04-27
Linux文件管理参考 2019-04-27
FTP文件管理项目(本地云)项目日报(一) 2019-04-27
FTP文件管理项目(本地云)项目日报(二) 2019-04-27
FTP文件管理项目(本地云)项目日报(三) 2019-04-27
FTP文件管理项目(本地云)项目日报(四) 2019-04-27
【C++】勉强能看的线程池详解 2019-04-27