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类为例
位拷贝拷贝的是地址,而值拷贝则拷贝的是内容。如果定义两个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的返回值表示其他程序处理消息后的返回值。