VC小问题解决方法.docx

上传人:b****8 文档编号:9698189 上传时间:2023-02-05 格式:DOCX 页数:40 大小:255.36KB
下载 相关 举报
VC小问题解决方法.docx_第1页
第1页 / 共40页
VC小问题解决方法.docx_第2页
第2页 / 共40页
VC小问题解决方法.docx_第3页
第3页 / 共40页
VC小问题解决方法.docx_第4页
第4页 / 共40页
VC小问题解决方法.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

VC小问题解决方法.docx

《VC小问题解决方法.docx》由会员分享,可在线阅读,更多相关《VC小问题解决方法.docx(40页珍藏版)》请在冰豆网上搜索。

VC小问题解决方法.docx

VC小问题解决方法

问题一:

英文版的VC运行时候中文出现乱码的解决

首先进入资源编辑状态ResourceView—>然后选中有中文显示的界面项目(如对话框,菜单,窗口等)—>再从VC工程的菜单栏中的View项中找到属性Properties,点击弹出对话框,设置对话框里的Language项为:

Chinese(P.R.C)即可。

问题二:

如何获得窗口的大小?

CRectS;

GetWindowRect(S);//获得窗口相对于屏幕的坐标位置

S.top;

s.left;

s.Right;

s.bottom;

//left,top是窗口左上角的横坐标和纵坐标

//right,bottom代表的是串口的右下角的横坐标和纵坐标

自己计算下位置就可以了最后用MoveWindow();

GetWindowRect()     得到的是在屏幕坐标系下的RECT(即以屏幕左上角为原点)      GetClientRect()     得到的是在客户区坐标系下的RECT(即以所在窗口左上角为原点,去掉了标题栏计算,仅仅是个大小,返回值的左上角永远为0,0)

问题三:

如何绘制一个简单的按钮并且映射函数

绘制按钮函数

问题四:

对于线程和进程的理解

进程与线程的一个简单解释

1.

计算机的核心是CPU,它承担了所有的计算任务。

它就像一座工厂,时刻在运行。

2.

假定工厂的电力有限,一次只能供给一个车间使用。

也就是说,一个车间开工的时候,其他车间都必须停工。

背后的含义就是,单个CPU一次只能运行一个任务。

3.

进程就好比工厂的车间,它代表CPU所能处理的单个任务。

任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。

4.

一个车间里,可以有很多工人。

他们协同完成一个任务。

5.

线程就好比车间里的工人。

一个进程可以包括多个线程。

6.

车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。

这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。

7.

可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。

里面有人的时候,其他人就不能进去了。

这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。

8.

一个防止他人进入的简单方法,就是门口加一把锁。

先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。

这就叫"互斥锁"(Mutualexclusion,缩写Mutex),防止多个线程同时读写某一块内存区域。

9.

还有些房间,可以同时容纳n个人,比如厨房。

也就是说,如果人数大于n,多出来的人只能在外面等着。

这好比某些内存区域,只能供给固定数目的线程使用。

10.这时的解决方法,就是在门口挂n把钥匙。

进去的人就取一把钥匙,出来时再把钥匙挂回原处。

后到的人发现钥匙架空了,就知道必须在门口排队等着了。

这种做法叫做"信号量"(Semaphore),用来保证多个线程不会互相冲突。

不难看出,mutex是semaphore的一种特殊情况(n=1时)。

也就是说,完全可以用后者替代前者。

但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。

操作系统的设计,因此可以归结为三点:

(1)以多进程形式,允许多个任务同时运行;

(2)以多线程形式,允许单个任务分成不同的部分运行;

(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

1、HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,

                 DWORDdwStackSize,

                 LPTHREAD_START_ROUTINElpStartAddress,

                 LPVOIDlpParameter,

                 DWORDdwCreationFlags,

                 LPDWORDlpThreadId);

该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄,其中各参数说明如下:

lpThreadAttributes:

指向一个SECURITY_ATTRIBUTES结构的指针,该结构决定了线程的安全属性,一

般置为NULL;

dwStackSize:

指定了线程的堆栈深度,一般都设置为0;

lpStartAddress:

表示新线程开始执行时代码所在函数的地址,即线程的起始地址。

一般情况为

(LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc是线程函数名;

lpParameter:

指定了线程执行时传送给线程的32位参数,即线程函数的参数;

dwCreationFlags:

控制线程创建的附加标志,可以取两种值。

如果该参数为0,线程在被创建后就会立

即开始执行;如果该参数为CREATE_SUSPENDED,则系统产生线程后,该线程处于挂起状态,并不马上执行

,直至函数ResumeThread被调用;

lpThreadId:

该参数返回所创建线程的ID;

如果创建成功则返回线程的句柄,否则返回NULL。

2、DWORDSuspendThread(HANDLEhThread);

该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。

3、DWORDResumeThread

(HANDLEhThread);

该函数用于结束线程的挂起状态,执行线程。

4、VOIDExitThread(DWORDdwExitCode);

该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。

其中参数dwExitCode用来设置线程

的退出码。

5、BOOLTerminateThread(HANDLEhThread,DWORDdwExitCode);

  一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用TerminateThread强行

终止某一线程的执行。

各参数含义如下:

hThread:

将被终结的线程的句柄;

dwExitCode:

用于指定线程的退出码。

  使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即

终止线程的执行,但并不释放线程所占用的资源。

因此,一般不建议使用该函数。

6、BOOLPostThreadMessage(DWORDidThread,

   UINTMsg,

   WPARAMwParam,

   LPARAMlParam);

该函数将一条消息放入到指定线程的消息队列中,并且不等到消息被该线程处理时便返回。

idThread:

将接收消息的线程的ID;

Msg:

指定用来发送的消息;

wParam:

同消息有关的字参数;

lParam:

同消息有关的长参数;

调用该函数时,如果即将接收消息的线程没有创建消息循环,则该函数执行失败

问题五:

怎么样在单文档中添加控件

建立一个单文档,在向导的最后一步把基类改成CFormViewl

这样就可以实现在单文档中添加控件。

问题六:

怎么样在单文档中做出一个串口程序

在VC6中可以通过打开“Project->AddtoProjcet->ComponentsandControls->RegisteredActiveControls”菜单项来选择MicrosoftCommunicationsControl,Version6.0命令将MSComm控件插入到当前的程序中。

同样在VC7中,通过在工具箱中单击“添加/移除项”在弹出对话框中COM组件中把MicrosoftCommunicationsControl,Version6.0项勾上按确定就可以了。

完成以上步骤后,就在工具箱中有了MSComm控件,将其拖到任何一个对话框中就可以实现添加MSComm控间资源的任务。

假设我们将其命名为IDC_MSCOMM。

 

2、  为控件资源创建MSComm的实例对象

 

由于文档没有初始化函数,所以我选择在View的OnCreate函数中为IDC_MSCOMM创建实例化对象。

具体就是在OnCreate函数中添加以下代码:

if(!

m_Comm.Create(NULL,WS_VISIBLE|WS_CHILD,CRect(0,0,0,0),this,IDC_MSCOMM))

       {

              AfxMessageBox("创建串口失败!

");

       }

       m_Comm.SetCommPort(m_nCom);//设置Com口

       m_Comm.SetInBufferSize(1024);//设置输入缓冲区大小

       m_Comm.SetOutBufferSize(512);//设置输出缓冲区大小

       if(!

m_Comm.GetPortOpen())

              m_Comm.SetPortOpen(TRUE);//如果串口没有打开则打开串口

       m_Comm.SetInputMode

(1);//设置输入方式为二进制方式

       m_Comm.SetSettings("4800,n,8,1");//设置串口特征如波特率等

       m_Comm.SetRThreshold

(1);//当接收一个字符就响应一个OnCom事件

       m_Comm.SetInputLen(0);//

 

3、  为控件资源添加相应的事件处理程序

 

本人在编程时需要串口接收的数据用在文档类中,所以在此步的操作为:

右键IDC_MSCOMM添加事件处理程序,在类列表中选择doc类,IDE就会自动为你添加相应的绑定代码和OnComm函数,你只需在该函数中添加具体的你的实现代码就可以了。

提供程序如下:

CArcMeasureView*pView=(CArcMeasureView*)((CMainFrame*)

((CArcMeasureApp*)AfxGetApp())->GetMainWnd())->GetActiveView();//取得视图指针地址

       VARIANTm_input;

       char*str;

       intk,nEvent;

       CStringstr2,m_RevData;

       nEvent=pView->m_Comm.GetCommEvent();//获得事件类型

       switch(nEvent)

       {

              case2:

//如果接受到字符

                     k=pView->m_Comm.GetInBufferCount();

                     if(k>0)

                     {

                            m_input=pView->m_Comm.GetInput();

                            str=(char*)m_input.parray->pvData;

                            if(*str=='H')

                            {    

·········//处理程序

                            }

                     }

                     break;

              ········

       }

当然假如你接收的数据要在View类里处理的话,那么比我以上代码还要简单,直接可以在以上类列表中选择View类即可。

并在View类的OnComm函数中添加具体的代码。

论坛

C++学习基础

VC6.0中如何改变对话框的背景颜色

2006-07-0306:

30:

48    来源:

互联网

----方法一:

调用CWinApp类的成员函数SetDialogBkColor来实现。

 

----其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。

下面的例子是将应用程序对话框设置为蓝色背景和红色文本,步骤如下:

 

----①新建一个基于Dialog的MFCAppWizard应用程序ExampleDlg。

 

----②在CExampleDlgApp:

:

InitInstance()中添加如下代码:

 

BOOLCExampleDlgApp:

:

InitInstance()

{

    CExampleDlgDlgdlg;

    m_pMainWnd=&dlg;

//先于DoModal()调用,将对话框设置为蓝色背景、红色文本

    SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));

    intnResponse=dlg.DoModal();

}

----编译并运行,此时对话框的背景色和文本色已发生了改变。

值得注意的是:

在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变应用程序中所有的对话框颜色,并不能针对某一个指定的对话框。

 

----方法二:

重载OnPaint(),即WM_PAINT消息。

有关代码如下(以上例工程为准):

 

voidCExampleDlgDlg:

:

OnPaint() 

{

    if(IsIconic())

 else

 {

        CRectrect;

        CPaintDCdc(this);

        GetClientRect(rect);

        dc.FillSolidRect(rect,RGB(0,255,0)); //设置为绿色背景

        CDialog:

:

OnPaint();

 }

----方法三:

重载OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor),即WM_CTLCOLOR消息。

具体步骤如下(以上例工程为准):

 

----①在CExampleDlgDlg的头文件中,添加一CBrush的成员变量:

 

classCExampleDlgDlg:

publicCDialog

{

...

protected:

CBrushm_brush; 

...

};

----②在OnInitDialog()函数中添加如下代码:

 

BOOLCExampleDlgDlg:

:

OnInitDialog() 

{

...

//TODO:

Addextrainitializationhere

m_brush.CreateSolidBrush(RGB(0,255,0));//生成一绿色刷子 

...

----③利用ClassWizard重载OnCtlColor(…),即WM_CTLCOLOR消息:

 

HBRUSHCExampleDlgDlg:

:

OnCtlColor

(CDC*pDC,CWnd*pWnd,UINTnCtlColor) 

{

/*

**这里不必编写任何代码!

**下行代码要注释掉

**HBRUSHhbr=CDialog:

:

OnCtlColor(pDC,pWnd,nCtlColor);

*/

returnm_brush; //返加绿色刷子

}

----方法四:

还是重载OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor),即WM_CTLCOLOR消息。

具体步骤如下(以上例工程为准):

 

----步骤①、②同上方法三中的步骤①、②。

 

----步骤③利用ClassWizard重载OnCtlColor(…)(即WM_CTLCOLOR消息)时则有些不同:

 

HBRUSHCExampleDlgDlg:

:

OnCtlColor

(CDC*pDC,CWnd*pWnd,UINTnCtlColor) 

{

HBRUSHhbr=CDialog:

:

OnCtlColor(pDC,pWnd,nCtlColor);

//在这加一条是否为对话框的判断语句

if(nCtlColor==CTLCOLOR_DLG)

returnm_brush; //返加绿色刷子

returnhbr;

}

在想使用CButtonST的工程中加入BtnST.h、BtnST.cpp、BCMenu.h、BCMenu.cpp4个文件、2个类。

1.在按钮上加入Icon,使Icon和文字同时显示

假设按钮ID为IDC_BUTTON1

a.添加成员变量 CButtonSTm_btn;

b.添加Icon资源,设其ID设为IDI_ICON1

c.在OnInitDialog函数中初始化按钮

m_btn.SubclassDlgItem(IDC_BUTTON1,this);

m_btn.SetIcon(IDI_EOAPP);

m_btn.SetFlat(FALSE);

注意:

为达到最好效果,请根据Icon的大小调整按钮的大小。

2.显示平面按钮

只需要在效果一的基础上把m_btn.SetFlat(FALSE);语句去掉。

3.使按钮上的图标可变

假设按钮ID为IDC_BUTTON1

1).添加成员变量

CButtonSTm_btn;

2).添加两个Icon资源,ID设为IDI_ICON1和IDI_ICON2

IDI_ICON1是普通状态的图标,IDI_ICON2是按下时的图标

3).在OnInitDialog函数中初始化按钮

m_btn.SubclassDlgItem(IDC_BUTTON1,this);

m_btn.SetIcon(IDI_ICON2,IDI_ICON1);

4.设置按钮在不同状态下的底色和文字颜色

假设按钮ID为IDC_BUTTON1

1).添加成员变量

    CButtonSTm_btn;

2).添加Icon资源,设其ID设为IDI_ICON1

3).在OnInitDialog函数中初始化按钮

    m_btn.SubclassDlgItem(IDC_BUTTON1,this);

    m_btn.SetIcon(IDI_ICON1);

    m_btn.SetColor(CButtonST:

:

BTNST_COLOR_BK_OUT,RGB(208,208,208));

    m_btn.SetColor(CButtonST:

:

BTNST_COLOR_BK_FOCUS,RGB(208,208,208));

    m_btn.OffsetColor(CButtonST:

:

BTNST_COLOR_BK_IN,30);

提示:

SetColor函数和OffsetColor函数的第一个参数表示按钮的各个状态,前景色就是文字的颜色,它们的取值表示:

    BTNST_COLOR_BK_IN//鼠标放在按钮内时的背景色

    BTNST_COLOR_FG_IN,//鼠标放在按钮内时的前景色

    BTNST_COLOR_BK_OUT,//普通状态时的背景色 

    BTNST_COLOR_FG_OUT,//普通状态时的前景色

    BTNST_COLOR_BK_FOCUS,//按钮被按下后的背景色

    BTNST_COLOR_FG_FOCUS,//按钮被按下后的前景色

5.设置图标和文字的位置

假设按钮ID为IDC_BUTTON1

1).添加成员变量

    CButtonSTm_btn;

2).添加Icon资源,ID设为IDI_ICON1

3).在OnInitDialog函数中初始化按钮

    m_btn.SubclassDlgItem(IDC_BUTTON1,this);

    m_btn.SetIcon(IDI_ICON1);

    m_btn.SetAlign(CButtonST:

:

ST_ALIGN_VERT);

提示:

SetAlign函数的第一个参数表示位置信息,缺省情况下,文字在图标右边

    ST_ALIGN_HORIZ//文字在右

    ST_ALIGN_VERT//文字在下

    ST_ALIGN_HORIZ_RIGHT//文字在左

6.根据Icon的形状设置按钮的形状

假设按钮ID为IDC_BUTTON1

1).添加成员变量

    CButtonSTm_btn;

2).添加Icon资源,设其ID设为IDI_ICON1

3).在OnInitDialog函数中初始化按钮

    m_btn.SubclassDlgItem(IDC_BUTTON1,this);

    m_btn.SetIcon(IDI_ICON1);

    m_btn.DrawBorder(FALSE);

    m_btn.SetColor(CButtonST:

:

BTNST_COLOR_BK_OUT,RGB(208,208,208));

    m_btn.SetColor(CButtonST:

:

BTNST_COLOR_BK_IN,RGB(208,208,208));

    m_btn.SetColor(CButtonST:

:

BTNST_COLOR_BK_FOCUS,RGB(208,208,208));

注意:

为达到最好效果,请根据Icon的大小调整按钮的大小。

并根据实际情况设置背景颜色。

请事先将按钮的文字去掉。

7.添加Tooltips

假设按钮ID为IDC_BUTTON1

1).添加成员变量

    CButtonSTm_btn;

2).添加Icon资源,设其ID设为IDI_ICON1

3).在OnInitDialog函数中初始化按钮

    m_btn.SubclassDlgItem(IDC_BUTTON1,this);

    m_btn.SetIcon(IDI_ICON1);

    m_btn.SetTooltipText(_T("Thisisatooltip./r/nMultiline!

"));

8.改变鼠标进入按钮时的形状(超链接效果)

假设按钮ID为IDC_BUTTON1

1).添加成员变量

    CBu

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1