博文
LINEDDA(1)(2006-12-03 00:53:00)
摘要:呵呵,看到这个题目你可能马上就想起了计算机图形学上的直线DDA算法把。这个函数实际上已经被winapi包含了,可以用来做动画。介绍一下函数:
void WINAPI LineDDA(int x1,int y1,int x2,int y2,LINEDDAPROC back,LPARAM l);
参数解释如下:
x1,y1;//直线的起点坐标
x2,y2;//直线的终点坐标
back;//回调函数,就是通过DDA算法计算出直线上一个象素的坐标后就马上调用
l;//可传值参数
再介绍一下回调函数:
typedef void (CALLBACK *LINEDDAPROC)(int x,int y ,LPARAM l)
x,y;//计算出的象素点坐标
l; //是刚才的传递参数
呵呵,有了这么多,就可以做很多事情了哦!我举一小例说明
1。利用向导生成一个基于SDI的程序。
2。在视类中响应左键单击事件:
void CLineDDAView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
::LineDDA(100,100,200,200,(LINEDDAPROC)hehe,(LPARAM)&dc);
CView::OnLButtonDown(nFlags, point);
}
3。声明回调函数为视类的静态成员函数:
static void CALLBACK hehe(int a,int b,LPARAM l);
在源文件中定义:
int a1=100,b1=100;//全局变量
void CALLBACK CLineDDAView::hehe(int a,int b,LPARAM l)
{
CDC *pDC=(CDC*)l;
&n......
不容小视的坐标问题 差点翻船!(2006-12-03 00:17:00)
摘要:没事的时候做了小程序,结果出现了大问题。
情况是这样的:
是一个基于对话框的程序。首先
BOOL Cmydlg::OnInitDialog()
{
......
CRect rect1;
GetWindowRect(rect1);
}
同时我也添加了一个按钮控件,处理单击事件:
void Cmydlg::OnButtonClk()
{
CRect rect2;
GetWindowRect(rect2);
}
以前我的理解是GetWindowRect获得的都是相对于屏幕坐标系的坐标,所以我猜想rect1此时不会左上角是0,0,,并且rect1==rect2,哪知道一跟踪,差点晕过去,左上角虽然不是0,但是也接近于0了,rect1也根本不等于rect2,这是怎么回事?
不明白。问了高手,才知道,原来在初始化(OnInitDialog)的时候,窗口还没有完全显示,此时用函数进行测试结果肯定不正确。后来测试的rect2才是真的屏幕坐标系上的坐标。原来是这样!好险!
但是我还有个问题没能解决。那就是rect1到底测的是什么呢?不知道,知道的告诉一下啊
下面再来谈谈MoveWindow
For a top-level CWnd object, the x and y parameters are relative to the upper-left corner of the screen. For a child CWnd object, they are relative to the upper-left corner of the parent window’s client area.
The MoveWindow function sends the WM_GETMINMAXINFO message. Handling this message gives CWnd the opportunity to modify the default values for the largest and smallest possible windows. If the parameters to the MoveWindow member function exceed......
如何初始化(2006-12-02 17:25:00)
摘要:1.想一下这个问题,现在在MFC的类中定义了一个成员数组,要初始化,怎么办?
比如:
本来想:int a[5]={1,2,3,4,5};
但是定义在类中,是不能像上面这样初始化的,只能一个一个的初始化。还真是不好办。
你有好方法吗?
不过,如果是静态成员,就很好办了。如在类中的定义:
static const CRect m_rcSquares[9];
//9个矩形。
初始化的语句可以写在源文件中:
const CRect COXgameDlg::m_rcSquares[9]={
CRect(16,16,112,112),
CRect(128,16,224,112),
CRect(240,16,336,112),
CRect(16,128,112,224),
CRect(128,128,224,224),
CRect(240,128,336,224),
CRect(16,240,112,336),
&......
MFC中的全局函数(2006-12-02 13:14:00)
摘要:初涉MFC,你可能以为c++是一个纯面向对象的语言。天天都在和类打交道,似乎感觉缺了点什么。一天突然想添加全局函数和变量,顿时不知道该怎么办,后来查了点资料再认真思考了一下,原来很简单。下面我就简单讲讲我的心得把。
1.extern 声明法
全局函数和变量的概念在c里面最先提出来。那个时候,我们都只编写最简单的main函数,然后再加上2个调用函数,或者加上全局变量。这个时候的全局变量只针对这一个文件(.c
或者cpp)。不知道大家还记得吗?还有一个外部变量。它是应用于多源文件。方法就是使用extern对所要引用的外部变量进行声明就可以了,这样就使外部变量的作用域其他源程序文件中。现在回想起这段话,不正是和眼前的MFC多源程序相关么?
事实也正是如此。当你在MFC中想定义一个全局变量时,如在视类CmyView中定义一个全局变量 int a;可以这样做:
在CmyView的源文件的最前面加入:
int a;
如果现在想在文档类中调用,那么只需包含视类的头文件,并且在文档类的源文件中加入
extern int a ;
这样就和视类共享这样一个全局变量。
全局函数的方法也是同样,不多说明。
2.static成员法
第二种方法也很简单,只是有时候很难想到,就是定义一个静态成员函数或者变量。因为是静态的,也就是不属于任何对象,而是属于这个类,那么你就不用担心在另一个类中调用函数或者变量的时候怎样去构造一个原类的对象。呵呵,这种方法很巧妙把。
同上面那个例子:
在CmyView中加入一个静态成员变量:
static int a;
记得要初始化。
然后在文档类中引用
CmyView::a
即可。
这种方法经常用于创建线程函数。因为要创建一个线程函数的话,不能使它成为成员函数,因为调用的时候还需要创建对象,不方便。这个时候用静态成员函数就很适合。
3.CWinApp派生法
就是派生一个类,继承于CWinApp,再在里面定义函数或者变量。这个为什么也可以叫做全局变量呢?如:
class CmyApp::pu......
几个学习的好网站(2006-11-29 20:35:00)
摘要:水电资源网
VC知识库
VC开发指南
GIS帝国论坛:
http://www.gisempire.com/bbs/index.asp
资源网站:
http://www.vckbase.com/bbs/viewtopic2.asp?rid=610196&sf=96
目前只有这些啊,哪位兄弟还有更好大的,就说一声啊......
VC中快捷键与加速键的区别(2006-10-22 00:54:00)
摘要:加速键与快捷键的区别
快捷键:
一般我们在输入菜单名的时候,可以在任意的位置加上一个符号"&",表示alt和“&”后面的字母一起构成了快捷键
比如菜单项“文件”可以输入“文件(&f)”,那么alt+f就是一个快捷键。如果再定义了子菜单项的快捷键,
比如“文件”下的“退出”,可以输入“退出(&e)”,那么此时要想用快捷键打开“退出”,可以先按alt+f,松开,
再按一下e
对于按钮也是可用的。
加速键:
属于一种资源,可以在资源编辑器中编辑。如果“退出”的ID是ID_EXIT,设置其加速键为ctrl+e
那么只要将资源载入并挂接了主程序,就可以按ctrl+e来执行。
不过要注意:
如果应用程序包含了几个子窗口,而且其中一个具有输入焦点,那么键盘消息发送到子窗口而不是主窗口,
但是加速键不一样,只要按下,引发的WM_COMMAND会发送给主窗口,即使子窗口具有输入焦点......
SDI中类与类的关系(2006-09-24 16:29:00)
摘要:
这张图也是个高人给我的,感觉有点像什么藏宝图似的.不过仔细一看,可能你真的会发现宝藏:
1. SDI是一中文档视图结构,由于文档视图与框架是相互联系的,彼此都包含了指向对方的指针,所以得有一个东西来管理他们,协调他们.文档模板就是这个作用:
它的构造函数如下:
pDocTemplate (
UINT nIDResouce,CRunTimeClass* pDocClass,CRuntimeClass * pFrameClass,CRuntimeClass* pViewClass);
那么这个对象是什么时候构造的呢?
BOOL CMyApp::InitInstance()
{
AfxEnableControlContainer();
......
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);
这就是先构造了个文档模板类指针,然后添加到文档模板链表(AddDocTemplate(pDocTemplate);)
2.
在OnNewDocument创建一份文档时,程序会调用很多函数(已经封装),有一个是CSingleDocTemplate::OpenDocumentFile,接着该函数就会调用CreateNewDocument,CreateNewFrame等来创建一个新的文档类对象,框架类对象和视类对象.一起为这份文档服务.
3.CSingleDocTemplate::OpenDocumentFile该函数会被调用的原因就是因为前面创建了单文档模板指针,添加进指针链表中,尔后又被其他......
LoadIcon(2006-09-24 15:23:00)
摘要:我也是vc初学者,但是经常碰到有人问关于LoadIcon的用法,我就随便谈谈它(实际MSDN是最好的老师)
一.在SDK平台上,它的原型是:
HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName);
1.函数说明:
该函数从与hInstance模块相关联的可执行文件中装入lpIconName指定的图标资源,仅当图标资源还没有被装入时该函数才执行装入操作,否则只获取装入的资源句柄
2.参数说明:lpIconName是指向NULL字符结尾的字符串的指针,它包含图标名.如果要使用windows预定义的图标,这是hInstance必须设置成NULL,lpIconName则可以是下列值:
IDI_APPLICATION:32512 IDI_QUESTION:332514
IDI_HAND:32513 IDI_EXCLAMATION:32515
IDI_ASTERISK :32516 IDI_WINLOGO:32517
可以用下面这个对话框来浏览图标
void CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here
static int i=0;
m_static1.ModifyStyle(0,SS_ICON);//m_static1是一个静态文本的关联变量
m_static1.SetIcon(::LoadIcon(NULL,(LPCTSTR)(32512+i)));
i++;
if(i>=6)
......