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