《vc++深入详解》部分学习笔记

1.       鼠标在桌面显示什么样的图标?桌面的背景色是什么?

窗口类:WNDCLASS

2.       窗口大小改变(重画)

int WINAPI WinMain(

  HINSTANCE hInstance,      // handle to current instance

  HINSTANCE hPrevInstance,  // handle to previous instance

  LPSTR lpCmdLine,          // command line

  int nCmdShow              // show state

)

{

       WNDCLASS wndcls;

       wndcls.cbClsExtra=0;

       wndcls.cbWndExtra=0;

       wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);

       wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);

       wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);

       wndcls.hInstance=hInstance;

       wndcls.lpfnWndProc=WinSunProc;

       wndcls.lpszClassName="Weixin2003";

       wndcls.lpszMenuName=NULL;

       wndcls.style=CS_HREDRAW | CS_VREDRAW;//x|y坐标位置发生重画)

       RegisterClass(&wndcls);

 

       HWND hwnd;

       hwnd=CreateWindow("Weixin2003","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW,

              0,0,600,400,NULL,NULL,hInstance,NULL);

 

       ShowWindow(hwnd,SW_SHOWNORMAL);

       UpdateWindow(hwnd);

 

       MSG msg;

       while(GetMessage(&msg,NULL,0,0))

       {

              TranslateMessage(&msg);

              DispatchMessage(&msg);

       }

       return 0;

}

 

3.       关闭窗口弹出对话框

LRESULT CALLBACK WinSunProc(

  HWND hwnd,      // handle to window

  UINT uMsg,      // message identifier

  WPARAM wParam,  // first message parameter

  LPARAM lParam   // second message parameter

)

{

       switch(uMsg)

       {

       case WM_CHAR:

              char szChar[20];

              sprintf(szChar,"char is %d",wParam);

              MessageBox(hwnd,szChar,"weixin",0);

              break;

       case WM_LBUTTONDOWN:

              MessageBox(hwnd,"mouse clicked","weixin",0);

              HDC hdc;

              hdc=GetDC(hwnd);

              TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训"));

              ReleaseDC(hwnd,hdc);

              break;

       case WM_PAINT:

              HDC hDC;

              PAINTSTRUCT ps;

              hDC=BeginPaint(hwnd,&ps);

              TextOut(hDC,0,0,"维新培训",strlen("维新培训"));

              EndPaint(hwnd,&ps);

              break;

       case WM_CLOSE:

              if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))/* 关闭窗口弹出对话框"是否真的结束?"*/

 

              {

                     DestroyWindow(hwnd);

              }

              break;

       case WM_DESTROY:

              PostQuitMessage(0);

              break;

       default:

              return DefWindowProc(hwnd,uMsg,wParam,lParam);

       }

       return 0;

}

 

 

 

4.       在桌面具体位置显示一句话

void CTextView::OnDraw(CDC* pDC)

{

       CTextDoc* pDoc = GetDocument();

       ASSERT_VALID(pDoc);

       // TODO: add draw code for native data here

       CString str;

       str="维新科学技术培训中心";

       pDC->TextOut(50,50,str);//5050处显示一句话(lesson5Bhtml

 

       /*CSize sz=pDC->GetTextExtent(str);

 

       str.LoadString(IDS_WEIXIN);

       pDC->TextOut(0,200,str);

 

       pDC->BeginPath();

       pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);

       pDC->EndPath();

       pDC->SelectClipPath(RGN_DIFF);

       for(int i=0;i<300;i+=10)

       {

              pDC->MoveTo(0,i);

              pDC->LineTo(300,i);

              pDC->MoveTo(i,0);

              pDC->LineTo(i,300);

       }*/

}

5.       修改窗口的外观和大小(lesson 9A )(msdn 中查询 window styles

(窗口创建之前

)在CMainFrame里面的BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

里进行修改窗口的外观和大小

SetWindowLong()函数可以改变窗口的属性

 

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

       if( !CFrameWnd::PreCreateWindow(cs) )

              return FALSE;

       // TODO: Modify the Window class or styles here by modifying

       //  the CREATESTRUCT cs

       cs.cx=300;

       cs.cy=200;//这两句设置窗口的大小

       cs.style=WS_OVERLAPPEDWINDOW;

       cs.lpszName="http://www.sunxin.org";//修改窗口的标题

      

       return TRUE;

}

6. 在窗口创建之后修改窗口的外观lesson 9A -2

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{。。。。。。。。。。。。。。。。。。。。。。

//在窗口创建之后修改窗口的外观

       //SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);//修改窗口名

       //SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_MAXIMIZEBOX);//修改窗口的 最大化建和双击窗口放大 的功能

/*    SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));//修改窗口的图标光标,但是需要在PreCreateWindow函数里定义自己的窗口类

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

………………………..

/****************************

WNDCLASS wndcls;变量

       wndcls.cbClsExtra=0;类的额外内存不需要

       wndcls.cbWndExtra=0;窗口的额外内存不需要

       wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);获取黑色的背景画刷,在框架类里不显示,只能在视图类里创建,可在BOOL CStyleView::PreCreateWindow函数里写入cs.lpszClass="sunxin.org";

       wndcls.hCursor=LoadCursor(NULL,IDC_HELP);系统标准的光标NULLID号,在框架类里不显示,只能在视图类里创建

       wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);标准的图标NULL及名字error(图标属于框架窗口,视图窗口凌驾与框架窗口之上,只能在框架类里修改

       wndcls.hInstance=AfxGetInstanceHandle();获取当前应用程序的句柄

(凡是前面带afx的函数都是系统框架的函数所有的类中都可以以直接的去调用

       wndcls.lpfnWndProc=::DefWindowProc;窗口的过程(缺省的,不修改),系统有两个DefWindowProc函数,所以要在前面写上::表示调用的是全局的API函数

       wndcls.lpszClassName="sunxin.org";类的名字

       wndcls.lpszMenuName=NULL;菜单的名字设为NULL并不影响窗口的创建

       wndcls.style=CS_HREDRAW | CS_VREDRAW;窗口类的类型 水平重画|垂直重画

 

       RegisterClass(&wndcls);创建完后把窗口类注册一下

框架窗口类的创建要按新创建的窗口类创建

       cs.lpszClass="sunxin.org";可以修改cs的类名

*****************/

       //cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,0,0,

              LoadIcon(NULL,IDI_WARNING));修改设定类的类型和光标图标背景色的类型。

不用再重新创建一个窗口类了,等同与上面的粉红色星号之间的所有代码

同时在view类的PreCreteWindow函数里写入

cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,

              LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0);

 

       //cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);箭头光标,波浪状的图标,透明的背景色

同时在view类的PreCreteWindow函数里写入

cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);

 

…………………………..

}

*/

 

。。。。。。。。。。。。。。。。。。。。

}

7. VC教学视频/Lesson9/Video/Lesson 9C .html

 

 

 

 

8.lesson10

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

改变对话框和控件的背景色,改变控件的文本颜色,对按钮控件的特殊处理。在窗口中显示一幅位图。

1)、改变对话框和控件的背景色 要用到函数CWnd::OnCtlColor

CSettingDlg 右击添加函数WM_CTLCOLOR   WM_PAINT  生成函数

HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{。。。。。。。。。。。。。。。。。。。。。。。}

要改变对话框和控件的背景色,需让函数返回我们自己定义的画刷,对CSettingDlg右击添加一个变量m_brush 类型是CBrush 私有的

在构造方法中对画刷初始化:

CSettingDlg::CSettingDlg(CWnd* pParent /*=NULL*/)

       : CDialog(CSettingDlg::IDD, pParent)

{

       //{{AFX_DATA_INIT(CSettingDlg)

       m_nLineWidth = 0;

       m_nLineStyle = -1;

       //}}AFX_DATA_INIT

       m_clr=RGB(255,0,0);

       m_brush.CreateSolidBrush(RGB(0,0,255)); //1.蓝色的画刷(CreateSolidBrush功能是创建一个有颜色的画刷)

然后把HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

里的返回值return hbr;改为return m_brush就完成了控件背景全是蓝色的

      

}

2)、对具体控件背景色的改变要用到函数GetDlgCtrlld(通常是获得一个子窗口的ID值)

HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

       HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

      

       // TODO: Change any attributes of the DC here

       if(pWnd->GetDlgCtrlID()==IDC_LINE_STYLE)//判断ID等于多少时修改背景色(如修改主框的背景色,它的ID要修改一下为IDC_LINE_STYLE)(Ctrl+Tab可以实现控件界面与代码界面的切换

       {

              pDC->SetTextColor(RGB(255,0,0));//改变主框的文本颜色

              pDC->SetBkMode(TRANSPARENT);//将文字的背景色设为透明的

              return m_brush;//返回指定的画刷就可以了

       }

       if(pWnd->GetDlgCtrlID()==IDC_LINE_WIDTH)//文本框的背景色改变

       {

              pDC->SetTextColor(RGB(255,0,0));

              //pDC->SetBkMode(TRANSPARENT);

              pDC->SetBkColor(RGB(0,0,255)); //改变单行控件的背景颜色

              return m_brush;

       }

       。。。。。。。。。。。。。。。。。。。。。。。。

       // TODO: Return a different brush if the default is not desired

       return hbr;

       //return m_brush;

}

(3)、改变字体(此例中文本框中的字体)的格式

先右击CSettingDlg添加一个私有的CFont类型的变量m_font这是一个字体。

在构造函数中对这个字体初始化:

CSettingDlg::CSettingDlg(CWnd* pParent /*=NULL*/)

       : CDialog(CSettingDlg::IDD, pParent)

{

       。。。。。。。。。。。。。。。。。。。。。。。。。。

       m_font.CreatePointFont(200,"华文行楷");//200为字体大小

}

判断一下当前绘制的是不是那个静态文本框:

HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

if(pWnd->GetDlgCtrlID()==IDC_TEXT)

       {

              pDC->SelectObject(&m_font);//将字体选择到设备描述体当中

       }

       /*if(pWnd->GetDlgCtrlID()==IDOK)

       {

              pDC->SetTextColor(RGB(255,0,0));//改变ok按钮的文字颜色

              return m_brush;

       }*/    // 但是这段代码没有作用 查看CButton的类成员

。。。。。。。。。。。。。。。。。。。。。

}

4)、改变ok按钮的文字颜色

先创建一个Button类:

插入一个类,Class Type MFC Class ,新类的名字是CTestBtn,基类是CButton

若点确定后出现问题的话把本程序的文件夹了的  .clw删除掉,然后再在程序的view->ClassWizard里重新建立一个ClassWizard数据库文件。File name Graphic.clw

这样就可以看到我们的CTestBtn类了,然后在CTestBtn右击建立虚函数。选Drawltem

然后

void CTestBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

{

       // TODO: Add your code to draw the specified item

       UINT uStyle = DFCS_BUTTONPUSH;

 

   // This code only works with buttons.

   ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);

 

   // If drawing selected, add the pushed style to DrawFrameControl.

   if (lpDrawItemStruct->itemState & ODS_SELECTED)

      uStyle |= DFCS_PUSHED;

 

   // Draw the button frame.

   ::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem,

      DFC_BUTTON, uStyle);

 

   // Get the button's text.

   CString strText;

   GetWindowText(strText);

 

   // Draw the button text using the text color red.

   COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255,0,0));

   ::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),

      &lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);

   ::SetTextColor(lpDrawItemStruct->hDC, crOldColor);

 

}

接下来把控件的ok按钮关联一个成员变量(右击控件ClassWizard)变量类型是CTestBtn名字是m_btnTest   然后到CSettingDlg的头文件里最上面写#include”TestBtn.h”

 

然后到控件窗口点ok按钮的右键的属性,选中Styles里的Owner draw就可以了

5)、改变按钮的背景颜色(有两个类可以实现,一个是老师写的,另一个是老师从网上下载的,下载的内容比较丰富):

把这两个类四个文件拷贝到当前程序所在文件夹,然后在程序里添加:工程,增加到工程,文件,增加进去四个文件

老师的类里面重写了Drawltem   更改相应控件的Styles里的Owner draw,然后添加一个成员变量,然后再把CSetting Dlg里的次变量的类名和包含的头文件改一下,分别改为SXBtn #include”SXBtn.h”

     当鼠标放在控件上的时候控件的文字和控件的背景颜色改变,鼠标移走后控件恢复原样

Lesson 10G .html0350—1200

 

 

9.lesson12

读写文件

 

Lesson15多线程与聊天室程序的创建

Lesson18ActiveX控件

ClockLesson19/Code/Lesson20/Code/Hook实现打开文件窗口

Lesson19动态链接库

 

 

 

1.      MFC生成的C++源文件中都有StdAfx.h,此文件包含了常用的AFX函数的声明,其中有afxwin.h,此文件包含了CRECT,CPointCWnd等许多类及其方法的声明。

在解决方案资源管理器中,Stdafx.h 位于头文件文件夹中,Stdafx.cpp 位于源文件文件夹中。

Stdafx.h

标准系统包含文件和经常使用但不经常变化的项目特定包含文件的包含文件。

不应在 stdafx.h 中定义或取消定义任何 _AFX_NO_XXX 宏;

Stdafx.cpp

包含预处理器指令 #include "stdafx.h" 并添加预编译类型的包含文件。任何类型的预编译文件(包括头文件)都将编译目标限制在那些需要进行编译的文件内,从而支持更快的编译速度。首次生成项目后,由于预编译头文件的存在,您会发现后面的生成速度要快得多。

 

2.        InvokeHelper 获取当用户双击此项时引发的处理程序。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.ToolBar与图片关联

 

 

CMAINFRAMONCreateBar()

 

ToolBar可以与图片关联

CImagelist

CBitmap

LosdBitmap函数加载图片

Add()添加图片到m_Imagelist对象里

M_wndToolBar.GetToolBarCtrl().SetImageList(…….);

 

SetButtons();

SetButtonsInfo()设计控件的信息 参数分别是:位置 ID 样式

 

控制大小

GetItemRect()获取控件的大小

SetSize()设置大小,参数分别是: 按钮的大小 ImageButton的大小

 

 

响应是在 view.cpp里响应

ONCOMMAND()是响应代码的  里面的做参数的函数是无参的

 

 

 

2、   创建并显示一个窗口

窗口类WndClass

创建窗口 CreateWindow()

注册窗口 registerclassregisterclassEx

WndProc是操作系统调用的

显示窗口ShowWindow()

但是这样窗口只是闪一下,所以要有个消息循环

(从操作系统取得消息(getmessage)然后发给窗口)

WhileGetmessage(&msg)

{

         TranslateMessage();//快捷键消息

}

 

DispathMessage();//分发消息

加头文件

#include<windows.h>

WndProc(……….)

{

          return DefWindowProc(…….);

}

 

窗口销毁消息

WM_DESTROY

具体代码如下:

#include <Windows.h>

//窗口类型说明

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

//-----------------以下初始化窗口类-------------------

 

int WINAPI WinMain( HINSTANCE hInstance,

                                        HINSTANCE hPrevInstance,

                                        LPSTR lpCmdLine,

                                        int nShowCmd )

{

         HWND hWnd;

         WNDCLASS wc;

         char szApplicationName[]="Neusoft Media Player 2008";//窗口标题

         //定义窗口类

         /*wc.cbSize = sizeof(WNDCLASS);*/

         wc.style    = CS_HREDRAW | CS_VREDRAW;//定义窗口类型为窗口大小变化时窗口重画

         wc.lpfnWndProc       = WndProc;//定义窗口处理函数

         wc.cbClsExtra             = 0;//窗口类无扩展

         wc.cbWndExtra                   = 0;//窗口实例无扩展

         wc.hInstance              = hInstance;//当前实例句柄

         wc.hIcon                     = LoadIcon(NULL,IDI_APPLICATION);//窗口的最小化图标为默认图标

         //************************************************************************

         //      要使用其中一个预先定义的图标,设置hInstance参数为NULLlpIconName参数下列值之一。

         //              

         //               IDI_APPLICATION

         //               默认的应用程序图标。

         //               IDI_ASTERISK

         //               相同IDI_INFORMATION

         //               IDI_ERROR

         //               手形图标。

         //               IDI_EXCLAMATION

         //               相同IDI_WARNING

         //               IDI_HAND

         //               相同IDI_ERROR

         //               IDI_INFORMATION

         //               星号图标。

         //               IDI_QUESTION

         //               问号图标。

         //               IDI_WARNING

         //               惊叹号图标。

         //      IDI_WINLOGO

         //***************************************************************************

         wc.hCursor                 = LoadCursor(NULL, IDC_ARROW);//窗口采用箭头光标

         wc.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);//窗口背景(HBRUSH)GetStockObject(WHITE_BRUSH)为白色背景

         wc.lpszMenuName    = NULL;//窗口中无菜单

         wc.lpszClassName     = szApplicationName;//定义窗口类名称

/*      wc.hIconSm                = NULL;*/

//----------------注册窗口类------------------------

         RegisterClass(&wc);

 

//----------------创建窗口类------------------------

          hWnd = CreateWindow(szApplicationName,szApplicationName, 

                   WS_OVERLAPPEDWINDOW, 10, 10, 600, 600, NULL, NULL, hInstance, NULL);

        

         ShowWindow(hWnd, SW_SHOW);//显示窗口

         UpdateWindow(hWnd);//绘制用户区

//-------------------消息循环---------------------------  

         MSG msg;

         while (GetMessage(&msg, NULL, 0, 0))

         {

                   TranslateMessage(&msg);

                   DispatchMessage(&msg);

         }

         return msg.wParam;//程序终止时将相应信息返回系统

}

 

//----------------------窗口函数--------------------------------

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMsg, WPARAM wPrm, LPARAM lPrm)

{

         switch (uiMsg)

         {

         case WM_DESTROY:

                   PostQuitMessage(0);//向应用程序发出WM_QUIT消息

                   break;

         case WM_LBUTTONDOWN:

                   MessageBox(hWnd, "hello", "f2", MB_OK|MB_ICONWARNING);

                   break;

                  

                   //case WM_DESTROY:

                   //       break;

         default:

                   return DefWindowProc(hWnd, uiMsg, wPrm, lPrm);

         }

        

         return 0;

}

//结束

 

3.

null "" 的区别

String str1 = null; str引用为空
String str2 = ""; str
应用一个空串

也就是null没有分配空间,""分配了空间,因此str1还不是一个实例化的对象,而str2已经实例化。

注意因为null不是对象,""是对象。所以比较的时候必须是 if(str1==null){....}if(str2.equals("")){}

对象用equals比较,null用等号比较。因此,如果str1=null;下面的写法错误:
if(str1.equals("")||str1==null){//
如果str1没有值,则....
//
。。。。
}

正确的写法是 if(str1==null||str1.equals("")){ //先判断是不是对象,如果是,再判断是不是空字符串
//...
}

 

 

4.NULLnull的区别是什么:

NULL代表空地址,null只是一个符号

5. 在对话框上显示指定大小视图,并移动到指定位置

本文内容参考了1和三变公子的博客资料2.

本文使用的方法在VC++.net 2003上调试通过。

今天下午要做个东西,在对话框上显示一个滚动视图,并在视图中绘制一些图像。
查了一些资料后觉得下述方法是可行的。

第一步,使用MFC向导建立了一个单文档的工程。新建一个对话框CMydlg,在头文件中定义CFrameWnd * m_pFrame。新建一个滚动视图CMyview,这时视图类的virtual void  OnInitialUpdate()函数是protected的,将其改为public,因为我们要在对话框中调用该函数。
第二步,在CMydlg::OnInitDialog()中加入下面的代码。
CCreateContext pContext;
CRect rectWndClient;
//
得到对话框客户区大小
GetClientRect(&rectWndClient);
//
下面是为了使视图框架比对话框小一些
rectWndClient.right-=45;
rectWndClient.top+=20;
rectWndClient.left+=45;
rectWndClient.bottom-=20;
m_pFrame= new CFrameWnd();
m_pFrame->Create(NULL,NULL,WS_VISIBLE|WS_CHILD,rectWndClient,this);
pContext.m_pCurrentDoc =NULL;//
我们没有建立文档
pContext.m_pNewViewClass = RUNTIME_CLASS(CMyview);
CMyview *pView =(CMyview *) ((CFrameWnd*)m_pFrame)->CreateView&pContext);
ASSERT(pView);
pView->ShowWindow(SW_NORMAL);
//
视图从框架左上角到右下角
rectWndClient.left-=45;//
使得rectWndClient.left等于0
rectWndClient.top-=20;//
使得rectWndClient.top等于0
rectWndClient.right-=45;
rectWndClient.bottom-=20;
pView->MoveWindow(rectWndClient);
pView->OnInitialUpdate();//
不加这一句在鼠标点击视图时会报错的,原因请看资料2

好了,到这里就可以在对话框上看到你的视图了,你可以像平常一样在OnDraw里画图看看效果。

 

 

 

6、在菜单一个操作(ID_DIALOG)响应后弹出一个模态对话框

先插入一个新 对话框,修改属性,对对话框建立一个新类CTestDlg

菜单的那个消息建立在view上,

并在加入~View.cpp的最上面加入头文件#include” TestDlg.h”

在消息 void ~View::onDialog()

{

       CTestDlg        dlg;

        dlg.DoModal();//对话框显示的时候对象的生命周期并没有结束

 

//非模态对话框用Create(对话框ID,父窗口的指针this)创建

//但是还需要用showWindow(SW_show);显示窗口

//但是将对象定义为局部变量是不可以的,应改为指针或者全局变量

/*    CTestDlg *pDlg=new CTestDlg();//这个指针应该在View类里定义为全局的,并在析构函//数里用delete释放

       pDlg->Create(IDD_DIALOG1,this);

       pDlg->ShowWindow(SW_SHOW);*/

}

6.       对话框的伸缩扩展功能了lesson 7F

增加一个控件,改变属性,IDIDC_BUTTON2 caption 收缩《

双击增加响应函数

void CTestDlg::OnButton2()

{

// TODO: Add your control notification handler code here

CString str;

if(GetDlgItemText(IDC_BUTTON2,str),str=="收缩<<")

{

        SetDlgItemText(IDC_BUTTON2,"扩展>>");

}

else

{

        SetDlgItemText(IDC_BUTTON2,"收缩<<");

}//这段代码实现控件点击时名称相互改变

//在对话框上添加一个分隔符,表示要切割的部分(用图像控件来代替,拉成一条线)

//改变它的属性:ID:IDC_SEPARATOR 并取消Visible的复选项 Styles:选择Sunken使成为下陷的状态

 

 

static CRect rectLarge;//保存还原后的对话框的尺寸

static CRect rectSmall;// 保存切割后的对话框的尺寸

if(rectLarge.IsRectNull())//判断矩形区域是否为空

{

        CRect rectSeparator;

        GetWindowRect(&rectLarge);//获得窗口的矩形区域

        GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator);//获得图像控件的矩形区域

 

        rectSmall.left=rectLarge.left;//左上角的横坐标=rectLarge.left

        rectSmall.top=rectLarge.top;//没有改变

        rectSmall.right=rectLarge.right; //没有改变

        rectSmall.bottom=rectSeparator.bottom; //改变

}

if(str=="收缩<<")

{

        SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),

               SWP_NOMOVE | SWP_NOZORDER);

}

else

{

        SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(),

               SWP_NOMOVE | SWP_NOZORDER);

}

}

 

 

汉字字库存储芯片扩展实验 # 汉字字库存储芯片扩展实验 ## 实验目的 1. 了解汉字字库的存储原理和结构 2. 掌握存储芯片扩展技术 3. 学习如何通过硬件扩展实现大容量汉字字库存储 ## 实验原理 ### 汉字字库存储基础 - 汉字通常采用点阵方式存储(如16×16、24×24、32×32点阵) - 每个汉字需要占用32字节(16×16)到128字节(32×32)不等的存储空间 - 国标GB2312-80包含6763个汉字,需要较大存储容量 ### 存储芯片扩展方法 1. **位扩展**:增加数据总线宽度 2. **字扩展**:增加存储单元数量 3. **混合扩展**:同时进行位扩展和字扩展 ## 实验设备 - 单片机开发板(如STC89C52) - 存储芯片(如27C256、29C040等) - 逻辑门电路芯片(如74HC138、74HC373等) - 示波器、万用表等测试设备 - 连接线若干 ## 实验步骤 ### 1. 单芯片汉字存储实验 1. 连接27C256 EPROM芯片到单片机系统 2. 将16×16点阵汉字字库写入芯片 3. 编写程序读取并显示汉字 ### 2. 存储芯片字扩展实验 1. 使用地址译码器(如74HC138)扩展多片27C256 2. 将完整GB2312字库分布到各芯片中 3. 编写程序实现跨芯片汉字读取 ### 3. 存储芯片位扩展实验 1. 连接两片27C256实现16位数据总线扩展 2. 优化字库存储结构,提高读取速度 3. 测试并比较扩展前后的性能差异 ## 实验代码示例(单片机部分) ```c #include <reg52.h> #include <intrins.h> // 定义存储芯片控制引脚 sbit CE = P2^7; // 片选 sbit OE = P2^6; // 输出使能 sbit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值