杂7杂8

int *p = new int[10];与int *p = new int(10);的区别

前者数组,后者表示为指针赋值10

 #pragma comment(linker, "/SECTION:.rdata,ERW") /*让只读节可写*/


#include "stdio.h"
#pragma comment(linker,"/SECTION:.rdata,ERW")
const cDATA=10;
void main()
{
    int *p=(int*)&cDATA;
    *p=30;
}
#include<iostream>
using namespace std;
int main(void)
{
        int a[2]={100,200};
        cout<<a<<"  "<<a-1<<endl;
        cout<<*(a-1);
}
数组名就是指向数组首元素的指针,指针运算中的"+"和"-"其实不是加和减,而是向后或向前移动。 所以a-4的意思是,指针a向前(值变小)移4个元素所占的字节。

MFC学习笔记----修改MFC默认生成的东东
  1 在创建之前  BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
cs.lpszClass =AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,0,NULL);//LoadIcon(NULL,IDI_ERROR));
    也可以自己设计个WNDCLASS style
然后用cs.lpszclass=设计的类名   在View类中也可以这样用
 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));
图标是在CMainFrame中修改,而光标、背景是在View中修改
SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP));
 SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));

实现图标随时间变化
extern CHuatuApp theApp;
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

 m_hICons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
 m_hICons[1]=LoadIcon(theApp.m_hInstance ,MAKEINTRESOURCE(IDI_ICON2));
 m_hICons[2]=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3));
 SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hICons[0]);

 SetTimer(1,1000,NULL);

--------------------------------

void CMainFrame::OnTimer(UINT nIDEvent)
{
 // TODO: Add your message handler code here and/or call default
 static int index=1;
 SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hICons[index]);
 index++;
 index=index%3;
 CFrameWnd::OnTimer(nIDEvent);
}

//  添加状态栏 并设置
在 CMainFrame 中添加
CProgressCtrl m_progress;
在 字串表中添加 IDS_PROGRESS
static UINT indicators[] =
{
 ID_SEPARATOR,           // status line indicator
 IDS_TIMER,
 IDS_PROGRESS,
 ID_INDICATOR_CAPS,
 ID_INDICATOR_NUM,
 ID_INDICATOR_SCRL,
};
状态栏需要在窗口绘制完成后添加到对应的面板中
所以需要在CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
函数中发送消息 来实现 绘制完 窗口
添加自定义消息
#define UM_PROGRESS WM_USER+1
消息映射主题 
ON_MESSAGE(UM_PROGRESS,OnProgress)
消息原型申明
 afx_msg void OnProgress();
函数实现
void CMainFrame::OnProgress ()
{
 CRect rec;
 m_wndStatusBar.GetItemRect (2,&rec);
 m_progress.Create (WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rec,&m_wndStatusBar,123);
 m_progress.SetPos (50);
}
让进度条动起来
void CMainFrame::OnTimer(UINT nIDEvent)
{
 // TODO: Add your message handler code here and/or call default
 CTime t=CTime::GetCurrentTime ();
 CString str=t.Format ("%H:%M:%S");
 CClientDC dc(this);
 
 CSize size=dc.GetTextExtent (str);
 m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,size.cx );
 m_wndStatusBar.SetPaneText (1,str);
  m_progress.StepIt ();
 CFrameWnd::OnTimer(nIDEvent);
}
// VC中加启动画面
工程--增加到工程--components and controls--VC++ components --Splash screen

//C++中的位拷贝和值拷贝
String类为例

Class String{
public:
    String(
const char *ch=NULL);//默认构造函数
    String(const String &str);//拷贝构造函数
   ~String(void);
   String 
&operator=(const String &str);//赋值函数
private:
   
char *m_data;
};

 

位拷贝拷贝的是地址,而值拷贝则拷贝的是内容。如果定义两个String对象A和B。A.m_data和B.m_data分别指向一段区域,A.m_data="windows",B.m_data=“linux";


如果未重写赋值函数,将B赋给A;则编译器会默认进行位拷贝,A.m_data=B.m_data


则A.m_data和B.m_data指向同一块区域,虽然A.m_data指向的内容会改变成"linux",但是这样容易出现这些问题:

(1):A.m_data原来指向的内存区域未释放,造成内存泄露。

(2):A.m_data和B.m_data指向同一块区域,任何一方改变都会影响另一方

 (3):当对象被析构时,B.m_data被释放两次。

对于编译器,如果不主动编写拷贝函数和赋值函数,它会以“位拷贝”的方式自动生成缺省的函数。

如果重写赋值函数和拷贝构造函数后,

A.m_data=B.m_data,进行的是值拷贝,会将B.m_data的内容赋给A.m_data,A.m_data还是指向原来的内存区域,但是其内容改变。


 PreCreate->Create->Paint

 AnimateWindow(m_hWnd,1000,AW_HOR_POSITIVE);
窗口动态显示,需要在winuser.h中做修改
#if(WINVER >= 0x0400)

SendMessage和PostMessage的区别
PostMessage 和SendMessage的区别主要在于是否等待其他程序消息处理。PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;而SendMessage必须等待其他程序处理消息后才返回,继续执行。这两个函数的返回值也不同,PostMessage的返回值表示PostMessage函数执行是否正确,而SendMessage的返回值表示其他程序处理消息后的返回值。

你可能感兴趣的:(杂7杂8)