博文

怎样在VC++中访问和修改注册表(转)(2006-03-04 15:28:00)

摘要:怎样在VC++中访问和修改注册表                     Windows95/98/Me的注册表包含了Windows95/98/Me的系统配置、PC机的硬件配置、Win32应用程序和用户的其他设置信息。注册表和INI文件不同,它是多层次的树状数据结构,具有六个分支(根键),每个分支又由许多的键和键值组成,而每个键则代表一个特定的配置项目。
                    在实际编程工作中,我们遇到了如何在Visual  C++中对Windows95/98/Me注册表整个树状结构信息进行访问和修改的问题,如查询和修改注册表中用户姓名和公司名称的有关信息。通过编程实践,我们实现了在Visual  C++中查询和修改系统注册表的有关信息。下面以一个实例说明具体的编程方法。
                    在Visual C++  6.0或5.0环境中新建一基于对话框的工程,设置两个命令按钮,名为“查询用户信息”和“修改用户信息”,用来查询和修改注册表中用户姓名和公司名称。这里须要指出的是,用户的信息位于系统注册表中\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\  的位置,键值名RegisteredOwner和RegisteredOrganization分别表示用户的姓名和用户公司的名称。                     1.查询用户......

阅读全文(3887) | 评论:0

改变对话框的背景色(2006-02-15 19:45:00)

摘要:改变对话框的背景色 黄基前(广西桂林) ---- 笔者曾在《软件报》2000年第5期中讨论过如何改变控件的颜色,但还有 相当一部分的读者来信提问:一个基于对话框的MFC AppWizard应用程序中,如 何改变对话框的背景颜色呢?对于这个问题,其实可以由几种不同的方法来实 现,具体如下(粗斜体代码为增添的): ---- 方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。 ---- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。 下面的例子是将应用程序对话框设置为蓝色背景和红色文本,步骤如下: ---- ① 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。 ---- ② 在CExampleDlgApp ::InitInstance()中添加如下代码: BOOL CExampleDlgApp: : InitInstance ( ) { … CExampleDlgDlg dlg; m_pMainWnd = &dlg; //先于DoModal()调用,将对话框设置为蓝色背景、红色文本 SetDialogBkColor(RGB(0,0,255),RGB(255,0,0)); int nResponse = dlg.DoModal(); … } ---- 编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的 是:在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变 应用程序中所有的对话框颜色,并不能针对某一个指定的对话框。 ---- 方法二:重载OnPaint(),即WM_PAINT消息。有关代码如下(以上例工程为准): void CExampleDlgDlg::OnPaint() { if (IsIconic()) … else { CRect rect; CPaintDC dc(this); GetClientRect(rect); dc.FillSolidRect(rect,RGB(0,255,0)); //设置为绿色背景 CDialog::OnPaint(); } ---- 方法三:重载OnCt......

阅读全文(3073) | 评论:0

VC小知识总结(2006-01-18 22:24:00)

摘要:26)CImageList控件中图象橙色被显示为黄色?
我使用了一个CImageList控件来装入位图,用于TREE控件,其它的色彩都很正常就是橙色被显示成为黄色. 你只能使用系统指定的20种颜色(橙色不包括在内);当然,你也可以用下面的方法来装载位图资源而不受颜色数的限制. HBITMAP LoadResourceBitmap(HINSTANCE hInstance, LPSTR lpString,
                           HPALETTE FAR* lphPalette)
{
    HRSRC hRsrc;
    HGLOBAL hGlobal;
    HBITMAP hBitmapFinal = NULL;
    LPBITMAPINFOHEADER lpbi;
    HDC hdc;
    int iNumColors;
    if (hRsrc = ::FindResource(hInstance, lpString, RT_BITMAP))
{
  hGlobal = ::LoadResource(hInstance, hRsrc);
  lpbi = (LPBITMAPINFOHEADER)LockResource(hGlobal);
  hdc = ::GetDC(NULL);
  *lphPalette = CreateDIBPalette ((LPBITMAPINFO)lpbi, &iNum......

阅读全文(5868) | 评论:0

VC小知识总结(2006-01-18 22:23:00)

摘要:(1)当文档被修改时,如何在标题上加上标志'*'?
重载CDocument类的虚函数virtual SetModifiedFlag: void CTest2Doc::SetModifiedFlag(BOOL bModified)
{
    CString strTitle = GetTitle();
    CString strDirtyFlag = " *"; // note space before the '*'
            // so we don't break Save As dialog     if (!IsModified() && bModified)
    {
        SetTitle(strTitle + strDirtyFlag);
    }
    else if ( IsModified() && !bModified )
    {
        int nTitleLength = strTitle.GetLength();
        int nDirtyLength = strDirtyFlag.GetLength();
        SetTitle( strTitle.Left(nTitleLength - nDirtyLength) );
  ......

阅读全文(5237) | 评论:0

VC小知识总结(2006-01-18 22:22:00)

摘要:(46) CDC中的竖排文本?
在OnDraw成员函数中我想让文本竖直对齐,但CDC类似乎不支持该处理 方法一:如果你的竖直对齐是指旋转文本的话,下面的代码会对你有帮助:该代码检查一个Check box控制,查看文本是否需要旋转. // m_pcfYTitle is a CFont* to the selected font.
// m_bTotateYTitle is a bool (==TRUE if rotated) void CPage1::OnRotateytitle()
{
LOGFONT lgf;
m_pcfYTitle->GetLogFont(&lgf);
m_bRotateYTitle=
        ((CButton*)GetDlgItem(IDC_ROTATEYTITLE))->GetCheck()>0; // escapement is reckoned clockwise in 1/10ths of a degree:
lgf.lfEscapement=-(m_bRotateYTitle*900);
m_pcfYTitle->DeleteObject(); m_pcfYTitle->CreateFontIndirect(&lgf);
DrawSampleChart();
}
注意如果你从CFontDialog中选择了不同的字体,你应该自己设定LOGFONT的lfEscapement成员.将初始化后的lfEscapement值传到CFontDialog中. 方法二:还有一段代码可参考: LOGFONT LocalLogFont; strcpy(LocalLogFont.lfFaceName, TypeFace); LocalLogFont.lfWeight = fWeight;
LocalLogFont.lfEscapement = Orient;
LocalLogFont.lfOrientation = Orient; if (MyFont.CreateFontIndirect(&LocalLogF......

阅读全文(10102) | 评论:0

C++/C试题的答案与评分标准(2006-01-18 22:16:00)

摘要:一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分) 请写出 BOOL  flag 与“零值”比较的 if 语句。(3分) 标准答案:     if ( flag )     if ( !flag ) 如下写法均属不良风格,不得分。     if (flag == TRUE)       if (flag == 1 )         if (flag == FALSE)           if (flag == 0)       请写出 float  x 与“零值”比较的 if 语句。(4分) 标准答案示例: const float EPSINON = 0.00001; if ((x >= - EPSINON) && (x <= EPSINON) 不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。    如下是错误的写法,不得分。     if (x == 0.0)       if (x != 0.0)            请写出 char  *p 与“零值”比较的 if 语句。(3分) 标准答案:     if (p == NULL)     if (p......

阅读全文(5132) | 评论:6

C++/C编程质量试题(2006-01-18 22:14:00)

摘要:       本试题仅用于考查C++/C程序员的基本编程技能。内容限于C++/C常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力。        笔试时间90分钟。请考生认真答题,切勿轻视。 一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分) 提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为:     if ( n == 0 )     if ( n != 0 ) 以此类推。 请写出 BOOL  flag 与“零值”比较的 if 语句: 请写出 float  x 与“零值”比较的 if 语句: 请写出 char  *p 与“零值”比较的 if 语句: 二、以下为Windows NT下的32位C++程序,请计算sizeof的值(10分)        char  str[] = “Hello” ;        char   *p = str ; int     n = 10; 请计算 sizeof (str ) =                  sizeof ( p ) =              ......

阅读全文(4156) | 评论:0

线程编程资料(2005-12-26 19:38:00)

摘要:这是收集于网络的一些线程编程资料. 进程由两部分组成:进程内核对象, 地址空间。进程是不活泼的,它的执行依赖于线程。
线程由两部分组成:线程内核对象,线程堆栈。
创建新线程:
DWORD WINAPI FUNC(PVOID pvParam)
int Param;
DWORD dwThreadID;
CreateThread(NULL,0,FUNC,(PVOID)&Param,0,&dwThreadID); 检查线程是否退出:
BOOL GetExitCodeThread(HANDLE hThread,PDWORD pdwExitCode);//如果还未终止,得到0x103.
获得伪句柄:
GetCurrentProcess()
GetCurrentThread() 获得运行时间:
GetProcessTimes()
GetThreadTimes() 线程或进程的伪句柄转化为实句柄:
DuplicatgeHandle();//此函数会增加内核对象的引用计数。 伪句柄用于本线程,获得这个句并不会影响内核对象的计数,而实句柄用于传递给子进程。 线程的暂停和运行:
ResumeThread(HANDLE)
SuspendThread(HANDLE)  //使用此函数要小心死锁。 线程休眠:
Sleep(DWORD dwMilliseconds);
自动退出当前时间片:
SwitchtoThread(); 可以获得和修改线程的上下文,使用之前要SuspendThread()
GetThreadContext()
SetThreadContext() 改变进程的优先级://记住进程是不可以调度的,调度的单位是线程。
BOOL SetPriorityClass();
DWORD GetPriorityClass(); 设定线程的相对优先级:
int GetThreadPriority(HANDLE hThread);
BOOL SetThreadPriority(Handle hThread,int nPriority); Microsoft保留了随时修改调度算法的权利,因此使用相对......

阅读全文(4416) | 评论:0

WINDOWS环境下的精确延时类(2005-12-25 10:50:00)

摘要:这是转自国外的一篇文章,实现了在WINDOWS下精确延时的功能
The proposed solution uses critical sections that don't rely on the thread scheduler to perform time slice allocation and thus are enterable as soon as they become available. This solution utilises the multimedia timer's capabilities to create periodic timers with the highest resolution possible (1msec) and a critical section to provide switching between the threads. Wait happens because the main program thread gets blocked on the timer critical section while the timer performs counting down cycles. Once this happens, the timer thread leaves the critical section, thus allowing the main thread to continue. Once the main thread enters the timer's critical section, it leaves it immediately, thus allowing the timer thread to block it again on the next pass. Because this solution does not involve context switching, the delay is minimal. The error level of this timer is below 5%. The presented class can be utilised as shown in the Delay() method below. ......

阅读全文(4379) | 评论:2