惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
Arctic Wolf
博客园 - 聂微东
F
Fortinet All Blogs
云风的 BLOG
云风的 BLOG
小众软件
小众软件
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Cloudflare Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
L
LangChain Blog
A
About on SuperTechFans
阮一峰的网络日志
阮一峰的网络日志
I
Intezer
T
The Blog of Author Tim Ferriss
Security Latest
Security Latest
C
CXSECURITY Database RSS Feed - CXSecurity.com
Know Your Adversary
Know Your Adversary
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Palo Alto Networks Blog
Scott Helme
Scott Helme
S
Secure Thoughts
Spread Privacy
Spread Privacy
T
Threat Research - Cisco Blogs
Attack and Defense Labs
Attack and Defense Labs
P
Privacy & Cybersecurity Law Blog
O
OpenAI News
H
Heimdal Security Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Help Net Security
Help Net Security
C
Cyber Attacks, Cyber Crime and Cyber Security
Blog — PlanetScale
Blog — PlanetScale
GbyAI
GbyAI
G
Google Developers Blog
博客园 - Franky
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
K
Kaspersky official blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Tor Project blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tenable Blog
Google Online Security Blog
Google Online Security Blog
PCI Perspectives
PCI Perspectives

博客园 - arvin2012

VC++常用方法函数集合, EVC++4.0 长用数据类型转换,FFT算法 指向函数的指针数组到底该怎么用 内存耗尽怎么办? 位运算符的一些简单应用 异步Socket通信总结 贵在坚持 vc++操作word MFC中的ClassWizard的使用 追MM与设计模式的有趣见解 动软.Net代码生成器 发布最新2.12版 vc中常用的方法 vc中读写注册表 c++ file and directory 删除,移动,目录浏览对话框,找某目录下的所有文件(包括子目录) 简单好用的读写ini文件的类 Windows API 技巧集 VC 常见的108个问题 VC中动态生成控件 什么是COM,如何使用COM
vc 使用总结
arvin2012 · 2008-07-28 · via 博客园 - arvin2012

    1,简述VC6下如何进行程序的调试。

在主菜单"Build"中,有一个Start Build的子菜单,它下面包含了Go菜单(快捷键为F5),选择后,程序将从当前语句进入调试运行,直到遇到断点或程序结束。

将鼠标移动到要调试的代码行,单击鼠标右键选择“Insert/Remove Breakpoint”,或者按下F9,可以在该行上添加断点,此时断点代码行前面出现一个棕色的圈,再次选择将清除断点。进入调试状态后,Debug菜单将取代Build菜单出现在菜单栏中,它下面包含常用的调试操作,如Step Over,单步运行并不跟踪到调用的函数内部;其他还包括Step Into,Step Out, Stop Debugging等调试方法。

    2, 简述在VC6建立的工程中后缀为.cpp,.h,.rc,.dsp,.dsw的文件的作用是什么?

.cpp是源程序代码C++文件

.h是包含函数声明和变量定义的头文件

.rc是定义资源的资源脚本文件

.dsp是工程文件,记录当前工程的有关信息

.dsw是工作区文件,一个工作区可能包含一个或多个工程

    3, 已知一个对话框上有一个编辑框控件,ID为IDC_EDIT1,为其关联了CEdit类型的变量m_edit1,使用两种方法,说明如何改变编辑框内部的文本为"Hello",写出程序代码的片断。

第一种方法:m_edit1.SetSel(0,-1);           

             m_edit1.ReplaceSel("Hello");    

第二种方法:SetWindowText("Hello");      

    4, 简述使用Windows API编写的一个基本的Windows应用程序框架的结构。

Windows API编写的基本应用程序框架至少应该包含程序入口函数WinMain和窗口函数WndProc。在主函数WinMain里面包含窗口类的定义和注册,窗口的创建和显示以及消息循环。

    5, 消息在Windows中的数据类型是什么,它有哪些成员变量,各有什么含义

消息的数据类型是MSG,它是一个结构体,其成员变量主要包括hwnd,表示消息的窗口句柄;message代表消息的类型;wParam和lParam包含消息的附加信息,随不同的消息有所不同。

    6, Windows的鼠标消息的长参数lParam与字参数wParam的含义是什么

鼠标消息的长参数lParam的低字节包含了鼠标光标位置的x坐标值,lParam的高字节包含了鼠标光标位置的y坐标值;字参数wParam内包含了指示当前按下的各种虚键状态的值。

    7, 说明使用一个非模态对话框的注意问题和用到的Windows API函数

使用一个非模态对话框应该注意一定要在样式中包含WS_VISIBLE才能正常显示;创建对话框使用CreateDialog函数;消息循环部分应该使用IsDialogMessage过滤消息;关闭对话框使用函数DestroyWindow。

    8, 简述在MFC应用程序中UpdateData函数的作用及其参数含义与使用场合。

UpdateData只有一个BOOL类型的参数,UpdateData(FALSE)一般用于对话框控件连接的变量值刷新屏幕显示;UpdateData(TRUE)用于获取屏幕数据到对话框控件连接的变量中。

    9, 列举列表框控件能够接受的三个消息类型,并说明其作用

LB_ADDSTRING用于在列表框中加入一项字符串;LB_DIR用于在列表框中列出指定文件;LB_GETTEXT用于获取指定项的文本。

    10, 在一个对话框上添加了三个单选按钮,要使它们之间自动实现互斥,应该注意什么问题,在VC环境下如何操作?

要实现一组单选按钮的自动互斥,应该让它们的控件ID值连续,并设置第一个单选按钮的Group属性,其他的不设。

    11, 简述由一个文档类派生自己的文档类,并实现文档的存取需要哪些步骤。

首先为每一个文档类型从CDocument派生一个相应的文档类;然后为该文档类添加成员变量以保存数据;最后重载Serialize成员函数以实现文档数据的串行化。

    12, 列举视图类(CView)的三个子类,并简要说明其作用。

CScrollView类提供视图的滚动显示;CEditView类支持在视图中的文本编辑操作;CHtmlView类支持在视图中显示和操作html文件。

    13, Visual C++ 6.0如何进入调试状态,在调试状态下能够显示哪些调试窗口,列举三个,其作用分别是什么?

启动调试后,在View菜单的Debug Window子菜单下可以打开一些辅助调试的窗口

Watch:显示察看当前语句和前面语句中变量值的窗口

Call Stack:显示察看调用堆栈的窗口

Memory:显示察看内存中内容的窗口

    14, 说明位图资源的创建及显示过程的步骤,并给出相应的Windows API函数名。

首先定义位图句柄HBITMAP hBitmap;第二步使用LoadBitMap加载位图;第三步,调用CreateCompatibleDC向系统申请内存设备环境句柄,并调用函数SelectObject把位图选入内存设备环境;第四步,调用BitBlt函数将位图从内存设备环境输出到指定的窗口设备环境中,从而实现显示位图。

    15, 如何获取字体句柄从而实现字体的输出,并给出相应的Windows API函数名。

首先定义字体句柄变量HFONT hF;然后调用函数GetStockObject获取系统的字体句柄,或者调用CreateFont得到自定义的字体句柄;最后调用SelectObject把字体句柄选入设备环境。

    16, 列举三种按钮的类型,并说明其作用和创建方法之间的不同之处。

常用的按钮有普通按钮、单选按钮、复选框,和组框。普通按钮作用是帮助用户触发指定动作;单选按钮一般各选项之间存在互斥性;复选框用来显示一组选项供用户选择,各选项之间不存在互斥;组框主要用于把控件分成不同的组并加以说明.

    17, 要使一个静态控件显示一个位图并能接受用户输入,应该注意什么问题。

要使静态控件显示位图,必须设定其风格包含SS_BITMAP,并在创建静态控件窗口,即调用CreateWindow时指定并加载位图;要使静态控件能够接收用户输入,必须设定其风格包含SS_NOTIFY。

VC学习笔记

VC学习笔记1:按钮的使能与禁止

用ClassWizard的Member Variables为按钮定义变量,如:m_Button1;

m_Button1.EnableWindow(true); 使按钮处于允许状态
m_Button1.EnableWindow(false); 使按钮被禁止,并变灰显示

VC学习笔记2:控件的隐藏与显示

用CWnd类的函数BOOL ShowWindow(int nCmdShow)可以隐藏或显示一个控件。

例1:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_EDIT1 );    //获取控件指针,IDC_EDIT为控件ID号
pWnd->ShowWindow( SW_HIDE );    //隐藏控件

例2:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_EDIT1 );    //获取控件指针,IDC_EDIT为控件ID号
pWnd->ShowWindow( SW_SHOW );    //显示控件

以上方法常用于动态生成控件,虽说用控件的Create函数可以动态生成控件,但这种控件很不好控制,所以用隐藏、显示方法不失为一种替代手段。

VC学习笔记3:改变控件的大小和位置

用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置。

void MoveWindow(int x,int y,int nWidth,int nHeight);
void MoveWindow(LPCRECT lpRect);
第一种用法需给出控件新的坐标和宽度、高度;
第二种用法给出存放位置的CRect对象;
例:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_EDIT1 );    //获取控件指针,IDC_EDIT1为控件ID号
pWnd->MoveWindow( CRect(0,0,100,100) );    //在窗口左上角显示一个宽100、高100的编辑控件

SetWindowPos()函数使用更灵活,多用于只修改控件位置而大小不变或只修改大小而位置不变的情况:
BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
第一个参数我不会用,一般设为NULL;
x、y控件位置;cx、cy控件宽度和高度;
nFlags常用取值:
SWP_NOZORDER:忽略第一个参数;
SWP_NOMOVE:忽略x、y,维持位置不变;
SWP_NOSIZE:忽略cx、cy,维持大小不变;
例:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_BUTTON1 );    //获取控件指针,IDC_BUTTON1为控件ID号
pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE );    //把按钮移到窗口的(50,80)处
pWnd = GetDlgItem( IDC_EDIT1 );
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE );    //把编辑控件的大小设为(100,80),位置不变
pWnd = GetDlgItem( IDC_EDIT1 );
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER );    //编辑控件的大小和位置都改变
以上方法也适用于各种窗口。

VC学习笔记4:什么时候设定视中控件的初始尺寸?

我在CFormView的视中加入了一个编辑控件,在运行时使它充满客户区,当窗口改变大小时它也跟着改变。
改变控件尺寸可以放在OnDraw()函数中,也可放在CalcWindowRect()函数中,当窗口尺寸发生变化时,它们都将被执行,且CalcWindowRect()函数先于OnDraw()函数,下例是在CalcWindowRect()函数中修改控件尺寸。
重载VIEW类的CalcWindowRect函数,把设定控件的尺寸的语句加入这个函数中。
例:
void CMyEditView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)
{
    // TODO: Add your specialized code here and/or call the base class

    CFrameWnd *pFrameWnd=GetParentFrame(); //获取框架窗口指针

    CRect rect;
    pFrameWnd->GetClientRect(&rect); //获取客户区尺寸

    CWnd *pEditWnd=GetDlgItem(IDC_MYEDIT); //获取编辑控件指针,IDC_MYEDIT为控件ID号
    pEditWnd->SetWindowPos(NULL,0,0,rect.right,rect.bottom-50,SWP_NOMOVE | SWP_NOZORDER); //设定控件尺寸,bottom-50是为了让出状态条位置。

    CFormView::CalcWindowRect(lpClientRect, nAdjustType);
}

VC学习笔记5:单选按钮控件(Ridio Button)的使用

一、对单选按钮进行分组:
每组的第一个单选按钮设置属性:Group,Tabstop,Auto;其余按钮设置属性Tabstop,Auto。

如:
Ridio1、Ridio2、Ridio3为一组,Ridio4、Ridio5为一组

设定Ridio1属性:Group,Tabstop,Auto
设定Ridio2属性:Tabstop,Auto
设定Ridio3属性:Tabstop,Auto

设定Ridio4属性:Group,Tabstop,Auto
设定Ridio5属性:Tabstop,Auto

二、用ClassWizard为单选控件定义变量,每组只能定义一个。如:m_Ridio1、m_Ridio4。

三、用ClassWizard生成各单选按钮的单击消息函数,并加入内容:

void CWEditView::OnRadio1()
{
    m_Ridio1 = 0;    //第一个单选按钮被选中
}

void CWEditView::OnRadio2()
{
    m_Ridio1 = 1;    //第二个单选按钮被选中
}

void CWEditView::OnRadio3()
{
    m_Ridio1 = 2;    //第三个单选按钮被选中
}

void CWEditView::OnRadio4()
{
    m_Ridio4 = 0;    //第四个单选按钮被选中
}

void CWEditView::OnRadio5()
{
    m_Ridio4 = 1;    //第五个单选按钮被选中
}

四、设置默认按钮:
在定义控件变量时,ClassWizard在构造函数中会把变量初值设为-1,只需把它改为其它值即可。
如:
//{{AFX_DATA_INIT(CWEditView)
m_Ridio1 = 0;    //初始时第一个单选按钮被选中
m_Ridio4 = 0;    //初始时第四个单选按钮被选中
//}}AFX_DATA_INIT

VC学习笔记6:旋转控件(Spin)的使用

当单击旋转控件上的按钮时,相应的编辑控件值会增大或减小。其设置的一般步骤为:
一、在对话框中放入一个Spin控件和一个编辑控件作为Spin控件的伙伴窗口,
设置Spin控件属性:Auto buddy、Set buddy integer、Arrow keys
设置文本控件属性:Number

二、用ClassWizard为Spin控件定义变量m_Spin,为编辑控件定义变量m_Edit,定义时注意要把m_Edit设置为int型。

三、在对话框的OnInitDialog()函数中加入语句:
BOOL CMyDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    
    m_Spin.SetBuddy( GetDlgItem( IDC_EDIT1 ) );    //设置编辑控件为Spin控件的伙伴窗口
    m_Spin.SetRange( 0, 10 );    //设置数据范围为0-10
    return TRUE;
}

四、用ClassWizard为编辑控件添加EN_CHANGE消息处理函数,再加入语句:
void CMyDlg::OnChangeEdit1()
{
    m_Edit = m_Spin.GetPos();    //获取Spin控件当前值
}

OK!

VC学习笔记7:程序结束时保存文件问题

在文档-视图结构中,用串行化自动保存文件在各种VC书上都有介绍。现在的问题是我不使用串行化,而是自己动手保存,当点击窗口的关闭按钮时,如何提示并保存文档。

用ClassWizard在文档类(CxxDoc)中添加函数CanCloseFrame(),再在其中加入保存文件的语句就可以了。
注:要保存的数据应放在文档类(CxxDoc)或应用程序类(CxxApp)中,不要放在视图类中。

例:
//退出程序
BOOL CEditDoc::CanCloseFrame(CFrameWnd* pFrame)
{
    CFile file;
    if(b_Flag)    //b_Flag为文档修改标志,在修改文档时将其置为True
    {
        int t;
        t=::MessageBox(NULL,"文字已经改变,要存盘吗?","警告",
                MB_YESNOCANCEL | MB_ICONWARNING);    //弹出提示对话框
        if(t==0 || t==IDCANCEL)
            return false;
        if(t==IDYES)
        {
            CString sFilter="Text File(*.txt)|*.txt||";
            CFileDialog m_Dlg(FALSE,"txt",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,(LPCTSTR)sFilter,NULL);    //定制文件对话框

            int k=m_Dlg.DoModal();    //弹出文件对话框
            if(k==IDCANCEL || k==0)
                return false;
            m_PathName=m_Dlg.GetPathName();    //获取选择的文件路径名
            
            file.Open(m_PathName,CFile::modeCreate | CFile::modeWrite);
            file.Write(m_Text,m_TextLen);    //数据写入文件
            file.Close();
        }
    }
    return CDocument::CanCloseFrame(pFrame);
}

VC学习笔记8:UpdateData()

对于可以接收数据的控件,如编辑控件来说,UpdateData()函数至关重要。当控件内容发生变化时,对应的控件变量的值并没有跟着变化,同样,当控件变量值变化时,控件内容也不会跟着变。
UpdateData()函数就是解决这个问题的。

UpdateData(true);把控件内容装入控件变量
UpdateData(false);用控件变量的值更新控件

如:有编辑控件IDC_EDIT1,对应的变量为字符串m_Edit1,
1、修改变量值并显示在控件中:
m_Edit1 = _T("结果为50");
UpdateData(false);
2、读取控件的值到变量中:
用ClassWizard为IDC_EDIT1添加EN_CHANGE消息处理函数,
void CEditView::OnChangeEdit1()
{
    UpdateData(true);
}