字体应用:
CFont font;
font.CreateFont(10 + x*8, //字体字符的逻辑高度
0, //字符平均宽度取默认值
0, //文本行角度为0,水平
0, //字符角度为0,正交
FW_NORMAL, //正常字体
FALSE, //不倾斜
FALSE, //不加下划线
FALSE, //不加删除线
ANSI_CHARSET, //字符集
OUT_DEFAULT_PRECIS, //字体输出的结果和要求的匹配
CLIP_DEFAULT_PRECIS, //如何剪裁落于剪裁区之外的字符
DEFAULT_QUALITY, //字体属性匹配的精确度
DEFAULT_PITCH|FF_MODERN, //字体间距和字体族
"Times New Roman"); //字符名称
CFont *oldFont = pDC->SelectObject(&font); //选择字体
pDC->TextOut(r.left + 200,r.bottom/2+50 * x,"FONT 字体演示"); //显示字符串
pDC->SelectObject(oldFont); //选择原有字体
CRect应用:
CRect r;
GetClientRect(&r); //获取屏幕大小
//随着屏幕的大小,改变屏幕颜色
if(r.right>700||r.bottom>500)
pDC->FillSolidRect(r,RGB(255,0,0));
else
if(r.right<700&&r.right>350||(r.bottom>250&&r.bottom<500))
pDC->FillSolidRect(r,RGB(0,255,0));
else
if(r.right<350&&r.right>0||(r.bottom>0&&r.bottom<250))
pDC->FillSolidRect(r,RGB(0,0,255));
滚动轴的使用:
//先将父类 CView 改成 CScrollView
CSize sizeTotal;// 设置实现滚动窗口时的窗口大小
sizeTotal.cx = pDoc->Text.GetLength()*5;
sizeTotal.cy = 0;//当窗口小于sizeTotal.cx,sizeTotal.cy时显示滚动轴
SetScrollSizes(1,sizeTotal);//设置滚动轴尺寸
// GetParentFrame()->RecalcLayout();
// ResizeParentToFit();//当对窗口进行声明后,调用ResizeParentToFit()来调整窗口大小
非模式对话框的创建:
CDlg1* dlg; //构造对象
dlg = new CDlg1(this); //开辟空间
dlg->Create(IDD_DIALOG); //创建窗口
dlg->ShowWindow(SW_RESTORE); //窗口显示状态
改变鼠标形状:
HCURSOR CUR; //定义对象
UINT CurName; //记录当前鼠标ID
LoadCursorID(IDC_CURSOR); //将IDC_CURSOR --> CurName(自定义函数)
CUR = AfxGetApp()->LoadCursor(CurName); //将鼠标改成目标鼠标
::SetCursor(CUR); //改变鼠标形状
简单写成: ::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR)); //IDC_CURSOR为资源鼠标ID
限制鼠标范围:
::SetCursor(IDC_CURSOR);
RECT rect;
GetClientRect(&rect);
ClientToScreen(&rect);
ClipCursor(&rect); //限制鼠标的移动范围
从键盘输入字符并显示:
void CEx2View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CEx2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->Text += nChar; //将输入字符写进,pDoc->Text
Invalidate(); //刷新
CScrollView::OnChar(nChar, nRepCnt, nFlags);
}
void CEx2View::OnDraw(CDC *pDC)
{
CEx2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->TextOut(0,0,pDoc->Text); //显示字符
}
菜单扩展的实现:
void CEx1View::OnExpand() //自定义的菜单映射函数
{
// TODO: Add your command handler code here
CMenu *pAddinMenu,*pTopMenu; //创建CMenu对象
pTopMenu = AfxGetMainWnd()->GetMenu(); //得到主菜单的指针
pAddinMenu = pTopMenu->GetSubMenu(3); //获取添加菜单命令的响应位置(位置从左到右为:0,1,2,3......)
ASSERT(pAddinMenu != NULL);
pAddinMenu->AppendMenu(MF_SEPARATOR); //在添加扩展菜单之前,添加一条分割线
CString MenuName;
for(int i = 0; i<2;i++) //i为添加菜单数(添加的菜单必须在同一遍内存中(资源树中的string table))
{
MenuName.LoadString(IDS_B + i); //调用用于显示菜单命令的字符串
pAddinMenu->AppendMenu(MF_STRING,IDS_B + i,MenuName); //指定位置添加字符串
} //利用for()循环语句添加扩展菜单
}
void CEx1View::OnStandard() //自定义的菜单映射函数
{
// TODO: Add your command handler code here
CMenu *pAddinMenu,*pTopMenu; //创建CMenu对象
pTopMenu = AfxGetMainWnd()->GetMenu(); //得到主菜单的指针
pAddinMenu = pTopMenu->GetSubMenu(3); //获取菜单位置(位置从左到右为:0,1,2,3......)
int i = pAddinMenu->GetMenuItemCount(); //获取菜单总数
if(6 == i) //6一般为菜单数
{
i--; //因为菜单从上往下数,为:0,1,2......
while(i > 2) //2为扩展前的菜单数(视具体情况而定)
{
pAddinMenu->RemoveMenu(i,MF_BYPOSITION); //删除菜单项
i--;
}
}
else
{
pAddinMenu->DeleteMenu(3,MF_BYPOSITION); //删除菜单项
pAddinMenu->RemoveMenu(3,MF_BYPOSITION);
pAddinMenu->RemoveMenu(3,MF_BYPOSITION);
}
}
创建活动工具条:
CToolBar *m_pColorToolBar; //定义工具条对象
void CMainFrame::OnViewColortoolbar()
{
// TODO: Add your command handler code here
if(m_pColorToolBar == NULL)
{
m_pColorToolBar = new CToolBar; //初始化m_pColorToolBar
if(m_pColorToolBar->Create(this) == 0)
{
MessageBox("创建失败"); //如果创建失败则显示一个信息对话框.
return;
}
m_pColorToolBar->LoadToolBar(IDR_COLORTOOLBAR); //获取工具条资源
m_pColorToolBar->EnableDocking(CBRS_ALIGN_ANY); //设置工具条出现时的位置
DockControlBar(m_pColorToolBar);
}
else
{
if(m_pColorToolBar->IsWindowVisible() == TRUE)
{
ShowControlBar(m_pColorToolBar,FALSE,FALSE);//if the window is visibble, hide it
}
else
{
ShowControlBar(m_pColorToolBar,TRUE,TRUE);//Otherwise, show it
}
}
}
数据存储与读出:
步骤:
1、完成要从磁盘串行读写的每个类;
2、实现对话类的Serialize()虚成员函数;
3、给对话对象添加从磁盘对象的代码。
4、给对话对象添加向磁盘写对象的代码。
在头文件:添加宏 DECLARE_DYNCREATE(CEx1Doc) //CEx1Doc为子类名
在cpp文件:添加宏 IMPLEMENT_DYNCREATE(CEx1Doc, CDocument) //CDocument为CObject的子类
void CEx1Doc::Serialize(CArchive& ar) //Serialize()的实现
{
if (ar.IsStoring())
{
// TODO: add storing code here
ar<<Text;
}
else
{
// TODO: add loading code here
ar>>Text;
}
}
CFileDialog类应用:(创建“打开”对话框)
CString FilePathName;
CString FileName;
CFileDialog dlg(TRUE,_T("TXT"),_T("*.TXT"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
_T("文本文件(*.TXT)|*.TXT|")); //设置打开文件为“.TXT”(过滤文件类型)
if(IDOK == dlg.DoModal())
{
FilePathName.Format("%s %s","filepath:",dlg.GetPathName()); //GetPathName()获取文件名和文件路径
FileName.Format("%s %s","filename:",dlg.GetFileName()); //GetFileName()获取文件名
}
Invalidate(); //更新OnDraw()函数
非打印的虚拟键码:
VK_CONTROL Control(控制)
VK_DELETE Delete
VK_DOWN 下箭头
VK_END End
VK_F1到F12 F1到F12
VK_HOME Home
VK_INSERT Insert
VK_LEFT 左箭头
VK_PAUSE Pause
VK_NEXT Page Down
VK_PRIOP Page UP
VK_SNAPSHOT Print Screen
VK_RIGHT 右箭头
VK_SHIFT Shift
VK_UP 上箭头
显示位图:CBitmap类
void CEx3View::OnDraw(CDC* pDC)
{
CEx3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap = MemDC.SelectObject(&Bitmap);
BITMAP bm;
Bitmap.GetObject(sizeof(BITMAP),&bm);
pDC->BitBlt(130,20,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY); //显示位图
MemDC.SelectObject(pOldBitmap);
}
关于BITMAP结构,代码中定义的BITMAP bm;BITMAP结构存储了这样的数据:
typedef struct tagBITMAP
{
int bmType;
int bmWidth;
int bmHeight;
int bmWidthBytes;
BYTE bmPlanes;
BYTE bmBitsPixel;
LPVOID bmBits;
}BIYMAP;
切分窗口:
CSplitterWnd m_wndSplitter; //定义对象
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
CRect cr;
GetClientRect(&cr); //获取窗口大小
CSize paneSize(cr.Width()/5,cr.Height()/5); //设置窗口的尺寸
m_wndSplitter.CreateStatic(this,3/*行数*/,2/*列数*/); //创建静态切分窗口
m_wndSplitter.CreateView(0/*表示第1行*/,0/*表示第1列*/,RUNTIME_CLASS(CEx3View),paneSize,pContext);
m_wndSplitter.CreateView(1/*表示第2行*/,0,RUNTIME_CLASS(CEx3View),paneSize,pContext);
m_wndSplitter.CreateView(2/*表示第3行*/,0,RUNTIME_CLASS(CEx3View),paneSize,pContext);
m_wndSplitter.CreateView(0,1/*表示第2列*/,RUNTIME_CLASS(CEx3View),paneSize,pContext);
m_wndSplitter.CreateView(1,1,RUNTIME_CLASS(CEx3View),paneSize,pContext);
m_wndSplitter.CreateView(2,1,RUNTIME_CLASS(CEx3View),paneSize,pContext);
return TRUE;
return CFrameWnd::OnCreateClient(lpcs, pContext);
}
24位或32位真彩色位图现实:
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,_T("start.bmp"),//图像文件名
IMAGE_BITMAP, //读入位图
0, //位图的宽度(不改变默认0)
0, //位图的高度(不改变默认0)
LR_CREATEDIBSECTION //创建DibSection
|LR_DEFAULTSIZE //源图像的大小
|LR_LOADFROMFILE); //从文件读
if(hBitmap == NULL)
return FALSE;
m_bitmap.Attach(hBitmap); //获取位图指针
函数LoadImage()提供了将资源中或文件中的位图、光标和图标的读入方法。并且,提供了Win95的DibSection的支持。
DibSection提供了一种直接对显示内容的控制方法,大大提高了图像绘制的能力及速度。