`
jgsj
  • 浏览: 1051566 次
文章分类
社区版块
存档分类
最新评论

VC++问题集4

 
阅读更多

31.如何实现禁用标题栏上的"最大化"、"最小化"和"关闭"按钮
禁用这些按钮涉及到的函数有:
LONG GetWindowLong:获得有关窗口的信息.
Long SetWindowLong:改变指定窗口的属性.
CMenu * GetSystemMenu:允许应用程序为复制或修改而访问窗口菜单.
UINT GetMenuItemID:返回位于菜单中指定位置处的项目的菜单ID。
UINT EnableMenuItem:使指定项目的菜单项有效,无效或变灰。
如下代码:
//禁用最小化按钮
void CMainFrame::OnMenudismin()
{
// TODO: Add your command handler code here
//获得窗口风格
Style = ::GetWindowLong(m_hWnd,GWL_STYLE);
//设置新的风格
Style &= ~(WS_MINIMIZEBOX);
::SetWindowLong(m_hWnd,GWL_STYLE,Style);
GetWindowRect(&Rect);
//重画窗口边框
::SetWindowPos(m_hWnd,HWND_TOP,Rect.left,Rect.top,Rect.Width(),
Rect.Height(),SWP_DRAWFRAME);
}
//禁用最大化按钮
void CMainFrame::OnMenudismax()
{
// TODO: Add your command handler code here
//获得窗口风格
Style = ::GetWindowLong(m_hWnd,GWL_STYLE);
//设置新的风格
Style &= ~(WS_MAXIMIZEBOX);
::SetWindowLong(m_hWnd,GWL_STYLE,Style);
GetWindowRect(&Rect);
//重画窗口边框
::SetWindowPos(m_hWnd,HWND_TOP,Rect.left,Rect.top,Rect.Width(),
Rect.Height(),SWP_DRAWFRAME);
}
//禁用关闭按钮
void CMainFrame::OnMenudisclose()
{
// TODO: Add your command handler code here
//获得系统菜单
CMenu *pMenu = GetSystemMenu(false);
//获得关闭按钮ID
UINT ID = pMenu->GetMenuItemID(pMenu->GetMenuItemCount()-1);
//使关闭按钮无效
pMenu->EnableMenuItem(ID,MF_GRAYED);
}
//使最小化按钮有效
void CMainFrame::OnMenuablemin()
{
// TODO: Add your command handler code here
//获得窗口风格
Style = ::GetWindowLong(m_hWnd,GWL_STYLE);
//设置新的风格
Style |= WS_MINIMIZEBOX;
::SetWindowLong(m_hWnd,GWL_STYLE,Style);
GetWindowRect(&Rect);
//重画窗口边框
::SetWindowPos(m_hWnd,HWND_TOP,Rect.left,Rect.top,Rect.Width(),
Rect.Height(),SWP_DRAWFRAME);
}
//使最大化按钮有效
void CMainFrame::OnMenuablemax()
{
// TODO: Add your command handler code here
//获得窗口风格
Style = ::GetWindowLong(m_hWnd,GWL_STYLE);
//设置新的风格
Style |= WS_MAXIMIZEBOX;
::SetWindowLong(m_hWnd,GWL_STYLE,Style);
GetWindowRect(&Rect);
//重画窗口边框
::SetWindowPos(m_hWnd,HWND_TOP,Rect.left,Rect.top,Rect.Width(),
Rect.Height(),SWP_DRAWFRAME);
}
//使关闭按钮有效
void CMainFrame::OnMenuableclose()
{
// TODO: Add your command handler code here
//获得系统菜单
CMenu *pMenu = GetSystemMenu(false);
//获得关闭按钮ID
UINT ID = pMenu->GetMenuItemID(pMenu->GetMenuItemCount()-1);
//使关闭按钮可用
pMenu->EnableMenuItem(ID,MF_ENABLED);
}
32.如何设置半透明窗体
要实现窗体的半透明效果,首先需要窗体具有0x80000值的扩展风格,然后调用User32动态库中

的SetLayeredWindowAttributes函数设置半透明窗体。在Visual C++中,

SetLayeredWindowAttributes函数并没有被直接封装,需要用户手动从user32动态库中导入。
使窗体具有0x80000值的扩展风格很容易,可以直接调用SetWindowLong API函数实现。
导入SetLayeredWindowAttributes函数,首先需要定义一个与SetLayeredWindowAttributes函数

具有相同函数原型的函数指针。
然后调用LoadLibrary函数加载user32动态库,最后调用GetProcAddress函数将

SetLayeredWindowAttributes
如下例:
//设置窗口扩展风格
SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),
GWL_EXSTYLE)|0x80000);

typedef BOOL (WINAPI *FSetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD);

FSetLayeredWindowAttributes SetLayeredWindowAttributes ;

HINSTANCE hInst = LoadLibrary("User32.DLL");

SetLayeredWindowAttributes =
(FSetLayeredWindowAttributes)GetProcAddress(hInst,"SetLayeredWindowAttributes");

if (SetLayeredWindowAttributes)
SetLayeredWindowAttributes(GetSafeHwnd(),RGB(0,0,0),128,2);
FreeLibrary(hInst);
33.如何实现百叶窗窗体
要实现百叶窗效果,可以使用Sleep函数,让界面在绘制的时候一点一点的绘制,就能实现。
参考如下代码:在OnPaint函数中.
int i,j,w,h;
CPaintDC dc(this);
CBitmap bit;
CDC mendc;
CRect rect;
this->GetWindowRect(&rect);
w=rect.Width();
h=rect.Height();
bit.LoadBitmap(IDB_BITMAP1);
mendc.CreateCompatibleDC(&dc);
mendc.SelectObject(&bit);

for(i=0;i<20;i++)
{

for(j=i;j<w;j+=20)
{
dc.BitBlt(j,0,1,h,&mendc,j,0,SRCCOPY);
Sleep(2);

}
}
mendc.DeleteDC();
::DeleteObject(&bit);
34.图文控件是实现
在Visual c++中,可以通过改写CButton的DrawItem方法实现自定义按钮的绘制。在按钮中绘制

图标主要使用了DrawItem方法中的lpDrawItemStruct参数的hDC成员来实现的。DrawItem方法是一个

虚拟方法,用于绘制控件的外观。。有关信息请查看MSDN。
如下示例:
1.派生一个CImageButton类。
void ImageButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC dc ;
dc.Attach(lpDrawItemStruct->hDC);
if (m_pImagelist)
{
UINT state = lpDrawItemStruct->itemState; //获取状态
UINT action = lpDrawItemStruct->itemAction;
//获取图像列中图像大小
IMAGEINFO imageinfo;
m_pImagelist->GetImageInfo(m_ImageIndex,&imageinfo);
CSize imagesize;
imagesize.cx = imageinfo.rcImage.right-imageinfo.rcImage.left;
imagesize.cy = imageinfo.rcImage.bottom - imageinfo.rcImage.top;
//在按钮垂直方向居中显示位图
CRect rect;
GetClientRect(rect);
CPoint point;
point.x = 5;
point.y = (rect.Height() - imagesize.cy)/2;
m_pImagelist->Draw

(&dc,m_ImageIndex,point,ILD_NORMAL|ILD_TRANSPARENT);
}
}
35.边框的绘制:
绘制边框我们使用FrameRect函数,FrameRect函数在矩形周围绘制边框。
如下示例:
HBRUSH CColourEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here
CDC* dc = GetDC(); //获取画布对象
CRect rect;
GetClientRect(rect); //获取客户区域
rect.InflateRect(1,1,1,1);//将客户区域增大一个像素
CBrush brush (m_Colour);//创建画刷
dc->FrameRect(rect,&brush);//绘制边框
// TODO: Return a non-NULL brush if the parent's handler should not be

called
return NULL;
}

36.设置编辑框文本颜色:
可以使用SetTextColor函数改变编辑框中文本的颜色,通过对消息WM_CTLCOLOR的响应来实现对

SetTextColor函数的调用。
如下示例:
HBRUSH CColourTextDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor == CTLCOLOR_EDIT)
pDC->SetTextColor(colour);
return hbr;
}
注:通过调用SetFocus函数能够响应WM_CTLCOLOR消息,既能让OnCtlColor函数调用.
37.一般的消息响应宏:
ON_BN_CLICKED( <id>, <memberFxn> ) afx_msg void memberFxn( );
ON_BN_DISABLE( <id>, <memberFxn> ) afx_msg void memberFxn( );
ON_BN_DOUBLECLICKED( <id>, <memberFxn> ) afx_msg void memberFxn( );
ON_BN_HILITE( <id>, <memberFxn> ) afx_msg void memberFxn( );
ON_BN_PAINT( <id>, <memberFxn> ) afx_msg void memberFxn( );
ON_BN_UNHILITE( <id>, <memberFxn> ) afx_msg void memberFxn( );

38.列表项的提示条
在默认情况下ListBox控件是不会自动显示水平滚动条的,如果ListBox控件的字符超出了列表的

宽度,那么超出的部分将无法显示。但我们可以通过加提示条的方法来解决这个问题.

39.关于数据库的操作:
先定义数据库操作的对象
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
CString TheValue;
打开数据库
::CoInitialize(NULL);先初始化环境
m_pConnection=NULL;
m_pConnection.CreateInstance(__uuidof(Connection));
m_pConnection->ConnectionString="uid=admin;pwd=111;DRIVER={Microsoft Access Driver

(*.mdb)};DBQ=mrsoft.mdb;";
m_pConnection->Open(L"",L"",L"",adCmdUnspecified);

读取数据库
m_pRecordset=m_pConnection->Execute((_bstr_t)("select * from info"),NULL,adCmdText);
::CoInitialize();

注:关于CoInitialize()我还不太清楚,若有它的详细信息请告诉我,我的QQ是616124480,邮箱

号码是wjh_monkey@163.com。谢谢。

40.关于带查询功能的ComboxBox控件
查询功能的ComboBox控件主要是指当用户在ComboBox控件中输入字符时,如果ComboBox控件中有

以该字符开头的字符串,ComboBox控件就将该字符串完全显示出来。
我们可以通过ComboBox中的SelctString方法实现在ComboBox控件中查找符合要求的字符串,通过

SetEditSel方法使字符串处于选中状态。
下面为示例代码:
void AutoComplete::OnEditupdate()
{
if(!m_bAutoComplete)
return;
CString str;
GetWindowText(str);
int nLength=str.GetLength();
DWORD dwCurSel=GetEditSel();

DWORD dStart =LOWORD(dwCurSel);
DWORD dEnd =HIWORD(dwCurSel);
if(SelectString(-1,str)==CB_ERR)
{
SetWindowText(str);
if(dwCurSel!=CB_ERR)
SetEditSel(dStart,dEnd);
}
GetWindowText(str);
if(dEnd < nLength && dwCurSel!=CB_ERR)
SetEditSel(dStart,dEnd);
else
SetEditSel(nLength,-1);
}
BOOL AutoComplete::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
m_bAutoComplete=true;
int nVirtKey=(int)pMsg->wParam;
if(nVirtKey==VK_DELETE||nVirtKey==VK_BACK)
m_bAutoComplete=false;
}
return CComboBox::PreTranslateMessage(pMsg);
}

分享到:
评论

相关推荐

    VC++ windows运行环境合集(VC++2005-VC++2022)

    总的来说,VC++ Windows运行环境合集是解决程序运行依赖问题的有效工具,它使得开发者可以轻松地在各种Windows系统上部署和运行他们的C++程序,尤其是那些基于MFC框架的应用。正确地管理和使用这些运行库,能够保证...

    VC++允许库合集,解决未能加载文件或程序集CefSharp.Core.dll问题

    总之,"VC++允许库合集"是解决C++应用程序依赖问题的关键,而“未能加载文件或程序集CefSharp.Core.dll”通常是由于缺少运行库支持或配置不当所致。通过正确安装和配置VC++运行库,以及检查CefSharp的部署情况,通常...

    计算机问题集vc++ASP

    计算机问题集VC++ ASP是一个资源包,包含了初学者在学习VC++和ASP编程时可能会遇到的问题及解答。这个集合对于那些刚开始接触这两种技术的人来说是非常有价值的,因为它提供了实践中的常见问题和解决方案,帮助他们...

    VC++常用数值算法集

    在编程领域,尤其是在科学计算和工程应用中,...综上所述,"VC++常用数值算法集"涵盖的内容丰富多样,是解决各种数学问题和工程计算的强大工具箱。通过理解和掌握这些算法,开发者能够编写出高效且精确的数值计算程序。

    VC++各版本合集2005-2017

    此外,此版本引入了新的诊断工具,帮助开发者检测并修复性能问题。 **VC++2013**加强了C++14标准的支持,比如通用初始化语法、可变模板参数列表等。同时,它在调试和性能分析方面有所提升,提供更好的用户体验。 *...

    VC++皮肤(合集)

    4. **39709571SkinShow**:这个名字可能指的是一个皮肤展示库,它可能包含了一些预设的皮肤样式,开发者可以从中选择合适的皮肤应用到自己的程序中。 5. **113172197SkinEasy**:这可能是一个简化皮肤应用过程的库...

    VC++串口通信经典VC++源码合集

    VC++中的ReadFile和WriteFile函数分别用于接收和发送数据,这两个函数都是异步的,因此在实际应用中可能需要配合GetOverlappedResult或WaitForSingleObject等函数处理同步问题。 在这些源码中,还涉及到数据转换...

    vc++技巧集

    4. **异常处理**:VC++支持C++标准的异常处理机制,书中会讲述如何正确地使用try、catch块来捕获和处理运行时错误。 5. **STL(Standard Template Library)**:VC++中包含STL,这是一个强大的模板库,提供了容器...

    VC++常见问题集—C++学习

    "VC++常见问题集—C++学习"这个资源正好为此目的而设计,它提供了一个关于C++编程的常见问题合集,帮助开发者解决实际编程过程中可能遇到的困扰。 首先,让我们探讨一些C++编程中常见的问题: 1. **编译错误**:...

    算法VC++程序集4

    顺序存储结构的表、堆栈和队列,链式存储结构的表、堆栈和队列,数组、串和广义表,递归,树和二叉树,图,排序,查找,文件。含有108个完整的程序源代码、可执行文件。

    (VC++2015 合集

    总的来说,VC++2015 Redistributable Package是确保基于VC++2015编译的应用程序正常运行的基础,它提供了必要的运行时环境和库文件,解决了程序依赖问题,并且随着微软的安全更新,确保了系统的安全性。无论是用户...

    VC++运行库合集

    VC++运行库合集

    微软常用VC++运行库合集 v2018.06.30(32&64;位)最新版

    - Microsoft Visual C++ 2012 Update 4 - Microsoft Visual C++ 2013 Update 5 - Microsoft Visual C++ 2015-2019 Redistributable **四、更新日志** "更新日志.txt" 文件通常记录了合集中的各个组件的版本更新和...

    VC++笔记-问题集

    **VC++笔记-问题集** 本笔记集合涵盖了VC++编程中的关键知识点,特别是关于多线程操作、进程通信以及自定义ActiveX控件制作的深入探讨。这些主题在实际开发中具有广泛的应用,理解并掌握它们对于提升软件工程能力至...

    算法VC++程序集5

    顺序存储结构的表、堆栈和队列,链式存储结构的表、堆栈和队列,数组、串和广义表,递归,树和二叉树,图,排序,查找,文件。含有108个完整的程序源代码、可执行文件。

    vc++编程指南和VC常见问题集(中文.chm).rar

    《VC++编程指南和VC常见问题集》是一个针对微软Visual C++(简称VC++)开发者的参考资料集合。这个压缩包包含两个.chm文件,分别是"vc++ 编程指南.chm"和"VC常见问题集(中文).chm",它们提供了关于VC++编程的全面...

    VC++教学实践实例合集

    这里包含了若干本VC++实例教程及实例,对VC++学习很有帮助,希望大家能够喜欢。由于文件太大,分为五个部分。part5

    VC++深入详解(完整版)+所有源代码集

    4. **内存管理**:VC++中的内存管理包括动态内存分配与释放,涉及到new、delete、malloc、free等操作。理解内存管理是防止内存泄漏和提高程序效率的关键。 5. **多线程编程**:多线程技术允许在一个进程中同时执行...

    微软VC++运行库合集.zip

    4. 冲突:尽管罕见,但安装多个版本的VC++运行库有可能引起冲突,如果遇到问题,可以尝试卸载不必要的版本或查找特定软件所需的版本进行安装。 总的来说,微软VC++运行库合集是Windows用户必备的工具之一,特别是...

    VC++运行库集合 6.0-2017

    随着时间的推移,微软不断更新和改进VC++运行库,引入了新的功能、优化了性能,并修复了已知的安全问题。例如,从VC++ 2005开始引入了.NET Framework的组件,使得C++开发者能够利用.NET平台的优势。在后续版本中,如...

Global site tag (gtag.js) - Google Analytics