??xml version="1.0" encoding="utf-8" standalone="yes"?>久久午夜无码鲁丝片秋霞 ,亚洲国产精品无码久久一区二区,久久久久99精品成人片http://www.shnenglu.com/xbgs/zh-cnWed, 07 May 2025 13:52:45 GMTWed, 07 May 2025 13:52:45 GMT60MFC中自׃用自定义消息http://www.shnenglu.com/xbgs/archive/2008/12/17/69647.html让心(j)飞翔让心(j)飞翔Wed, 17 Dec 2008 05:18:00 GMThttp://www.shnenglu.com/xbgs/archive/2008/12/17/69647.htmlhttp://www.shnenglu.com/xbgs/comments/69647.htmlhttp://www.shnenglu.com/xbgs/archive/2008/12/17/69647.html#Feedback0http://www.shnenglu.com/xbgs/comments/commentRss/69647.htmlhttp://www.shnenglu.com/xbgs/services/trackbacks/69647.html    消息映射、@环机制是WindowsE序q行的基本方式。VC++ MFC 中有许多现成的消息句柄,可当我们需要完成其它的dQ需要自定义消息Q就遇到?jin)一些困难?br>    在MFC ClassWizard中不允许d用户自定义消息,所以我们必dE序中添加相应代码,以便可以象处理其它消息一样处理自定义消息。通常的做法是采取以下步骤:
W一?定义消息?/font>
 推荐用户自定义消息至是WM_USER+100Q因为很多新控g也要使用WM_USER消息?br>#define WM_MY_MESSAGE (WM_USER+100) 
W二?实现消息处理函数?/strong>
该函C用WPRAM和LPARAM参数q返回LPESULT?
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
    // TODO: 处理用户自定义消?
    ...
    return 0;

W三?在类头文件的AFX_MSG块中说明消息处理函数:
class CMainFrame:public CMDIFrameWnd
{
    ...
    // 一般消息映函?
    protected:
    // {{AFX_MSG(CMainFrame)
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
}
W四?在用L(fng)的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函C?/strong>
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
    ON_WM_CREATE()
    ON_WM_TIMER()
    ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

 
  如果用户需要一个定义整个系l唯一的消?可以调用SDK函数RegisterWindowMessage定义消息:
static UINT WM_MY_MESSAGE=RegisterWindowMessage("User");

  q用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指?其余步骤同上?br>  当需要用自定义消息?可以在相应类中的函数中调用函数PostMessage或SendMessage发送消?font color="#990000">PoseMessage(WM_MY_MESSAGE,O,O);

如果向其他进E发送消息可通过如下Ҏ(gu)发送消?
DWORD result;
SendMessageTimeout(wnd->m_hWnd, // 目标H口
                   WM_MY_MESSAGE, // 消息
                   0, // WPARAM
                   0, // LPARAM
                   SMTO_ABORTIFHUNG |
                   SMTO_NORMAL,
                   TIMEOUT_INTERVAL,
                   &result);
以避免其它进E如果被d而造成pȝȝ状态?br>    可是如果需要向其它c?(如主框架、子H口、视cR对话框、状态条、工h或其他控件等 发送消息时上述Ҏ(gu)昑־无能为力Q而在~程q程中往往需要获取其它类中的某个识别信号 框架l我们造成?jin)种U限?但是可以通过获取某个cȝ指针而向q个cd送消息, 而自定义消息的各U动作则在这个类中定义,q样可以自p在的向其它类发送消息了(jin)?nbsp;


  下面丄例子叙述?jin)向视类和框架类发送消息的Ҏ(gu)Q?br>★在L架类中向视类发送消息:(x)
1.视类中定义消息:(x)
ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage) //定义消息映射

2.视类定义消息处理函数Q?br>LRESULT CMessageView::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
    // TODO: 处理用户自定义消?
    ...
    return 0;
}
3.发送消息的试函数
void CMainFrame::OnTest()
{
    CView * active = GetActiveView();//获取当前视类指针
    if(active != NULL)
    active->PostMessage(WM_MY_MESSAGE,0,0);
}
★在其它cM向视cd送消息:(x)
//发送消息的试函数
void CMyDialog::OnTest()
{
    CMDIFrameWnd *pFrame;
    CMDIChildWnd *pChild;
    CView *pView;
    //获取ȝ口指?br>    pFrame =(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
    // 获取子窗口指?br>    pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
    //获取视类指针
    pView = pChild->GetActiveView();
    if(pView != NULL)
    pView->PostMessage(WM_MY_MESSAGE,0,0);//发送消?br>}
其余步骤同上?br>★在视类中向L架发送消?
首先在主框架中定义相关的消息,Ҏ(gu)同上,然后在发送消息的函数中添加代码如?br>//发送消息的试函数
void CMessageView::OnTest()
{
    CFrameWnd * active = GetActiveFrame();//获取当前ȝ口框架指?br>    if(active != this)
    active->PostMessage(WM_MY_MESSAGE,0,0);
    return 0;
}
  在其它类中向不同的类发送消息可依次Ҏ(gu)cLQ这h们的E序可以的不受限制向其它类和进E发送消息,而避免了(jin)U种意想不到的风险?br> 
【实例?
  下面一个例子程序ؓ(f)多文档程序里在一对话框中向视cd送消?详述?jin)发送自定义消息的具体过E?br>  实现步骤Q?/p> W一步:(x)在VC++中新建工EMessageQ所有ClassWizard步骤选项均ؓ(f)~省,完成?br>W二步:(x)在主菜单中添加测试菜单ؓ(f)调出对话框,在框架类中徏立相应函数OnTest().
W三步:(x)在资源中建立对话框,通过ClassWizardd新类TestDialog,d试按钮, 在对话框cM建立相应函数OnDialogTest()
//通过对话框按钮发送消息的函数
void TestDialog::OnDialogTest()
{
    CMDIFrameWnd *pFrame;
    CMDIChildWnd *pChild;
    CView *pView;
    //获取ȝ口指?br>    pFrame =(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
    // 获取子窗口指?br>    pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
    //获取视类指针
    pView = pChild->GetActiveView();
    if(pView != NULL)
    pView ->PostMessage(WM_MY_MESSAGE,0,0);//发送消?br>}
  在Message.h头文件中d如下语句Q?br>static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");
W四?在视cMd自定义消?
在头文gMessageView.h中添加消息映?br>protected:
//{{AFX_MSG(CMessageView)
//}}AFX_MSG
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); //此行为添加代?br>DECLARE_MESSAGE_MAP()
在视cL件MessageView.cpp中的消息映射中添加自定义消息映射
BEGIN_MESSAGE_MAP(CMessageView, CView)
//{{AFX_MSG_MAP(CMessageView)
//}}AFX_MSG_MAP
// Standard printing commands
ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage) //此行d代码定义唯一消息
END_MESSAGE_MAP()
d相应?消息处理函数
LRESULT CMessageView::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
    CRect rect;
    GetClientRect(&rect);
    InvalidateRect(&rect);
    test=!test;
    return 0;
}
在MessageView.h中添加布?yu)(dng)变?public:BOOL test;
在视cL造函C初始?test变量:test=FALSE;
修改CMessageView::OnDraw()函数
void CMessageView::OnDraw(CDC* pDC)
{
    CMessageDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // 以下E序昄消息响应效果
    if(test)
    pDC->TextOut(0,0,"消息响应!");
}
W五步:(x)昄试对话?br>在MainFramecM包含对话框头文gQ?br>#include "TestDialog.h";
OnTest()函数中添加代?br>void CMainFrame::OnTest()
{
    TestDialog dialog;
    dialog.DoModal();
}
q行E序,在测试菜单打开对话?点击试按钮卛_看到l果

让心(j)飞翔 2008-12-17 13:18 发表评论
]]>
WM_CTLCOLOR消息的用?/title><link>http://www.shnenglu.com/xbgs/archive/2006/06/23/8940.html</link><dc:creator>让心(j)飞翔</dc:creator><author>让心(j)飞翔</author><pubDate>Fri, 23 Jun 2006 15:21:00 GMT</pubDate><guid>http://www.shnenglu.com/xbgs/archive/2006/06/23/8940.html</guid><wfw:comment>http://www.shnenglu.com/xbgs/comments/8940.html</wfw:comment><comments>http://www.shnenglu.com/xbgs/archive/2006/06/23/8940.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/xbgs/comments/commentRss/8940.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/xbgs/services/trackbacks/8940.html</trackback:ping><description><![CDATA[ <div> <table align="center" border="0" cellpadding="2" cellspacing="0" width="775"> <tbody> <tr> <!--左侧面--> <td valign="top" width="574"> <div> <table align="center" border="0" cellpadding="2" cellspacing="0" width="775"> <tbody> <tr> <!--左侧面--> <td valign="top" width="574">很多人都觉得自己的程序的界面不那么美观,往往VC默认产生的对话框比较单调Q因此很多h往往扑ֈ很多其它的控件对对话框进行美化修饎ͼ例如l静态控件设|字体,讄背景颜色{等Q?其实q些完全可以由VC自己的WM_CTLCOLOR消息来完成! <p>WM_CTLCOLOR消息用来完成对EDIT、STATIC、BUTTON{控件设|背景和字体颜色Q其用法如下Q?/p><p>1.首先在自己需要设|界面的对话框上点击右键-->建立cd?->加入WM_CTLCOLOR消息-->自动生成OnCtlColorQ)(j)函数Q此函数可以Ҏ(gu)对话框的控g的界面外观做修饰Q用法如下:(x)<br />类向导产生的函数做如下修改Q?br /></p><pre style="font-size: 9pt; color: rgb(51, 102, 153); background-color: rgb(255, 255, 234);" cccc="" solid="" 宋体?;border:1px="">HBRUSH CDialogColor::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) <br />{<br /> HBRUSH hbr = CDialog::OnCtlColor(pDC,pWnd, nCtlColor);<br /> // TODO: Change any attributes of theDC here<br /> //讄昄字体<br /> CFont * cFont=new CFont;<br /> cFont->CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0, <br /> ANSI_CHARSET,OUT_DEFAULT_PRECIS,<br /> CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,<br /> DEFAULT_PITCH&FF_SWISS,"Arial");<br /> //对特定的控g做修?br /> switch()<br /> {<br /> case CTLCOLOR_STATIC: //Ҏ(gu)有静态文本控件的讄<br /> {<br /> pDC->SetBkMode(TRANSPARENT); <br /> //讄背景为透明<br /> pDC->SetTextColor(RGB(255,255,0)); //讄字体颜色<br /> pWnd->SetFont(cFont); //讄字体<br /> HBRUSH B = CreateSolidBrush(RGB(125,125,255)); <br /> //创徏d<br /> return (HBRUSH) B; //q回d句柄<br /> }<br /> case CTLCOLOR_EDIT: //Ҏ(gu)有编辑框的设|?br /> {<br /> pDC->SetBkMode(TRANSPARENT); <br /> pDC->SetTextColor(RGB(255,255,0)); <br /> pWnd->SetFont(cFont); <br /> HBRUSH B = CreateSolidBrush(RGB(125,125,255)); <br /> return (HBRUSH) B; <br /> }<br /> default:<br /> return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);<br /> }<br />}<br /></pre><br />注:(x)case的类别有以下几种Q?br />CTLCOLOR_BTN 按钮控g<br />CTLCOLOR_DLG 对话?br />CTLCOLOR_EDIT ~辑?br />CTLCOLOR_LISTBOX 列表?br />CTLCOLOR_MSGBOX 消息?br />CTLCOLOR_SCROLLBAR 滚动?br />CTLCOLOR_STATIC 静态文?<br /><br />2.你可能觉得对所有的控g使用l一的界面设|觉得不自由Q其实VC同样可以对特定的ID的控件进行设|,Ҏ(gu)如下Q? <pre style="font-size: 9pt; color: rgb(51, 102, 153); background-color: rgb(255, 255, 234);" cccc="" solid="" 宋体?;border:1px=""><br /><br /> switch (pWnd->GetDlgCtrlID()) <br /> { <br /> //针对ID为IDC_CTL1、IDC_CTL2和IDC_CTL3的控件进行同L(fng)讄<br /> case IDC_CTL1:<br /> case IDC_CTL2:<br /> case IDC_CTL3: <br /> {<br /> pDC->SetBkMode(TRANSPARENT);<br /> pDC->SetTextColor(RGB(255,255, 0));<br /> pWnd->SetFont(cFont);<br /> HBRUSH B = CreateSolidBrush(RGB(125,125,255));<br /> return (HBRUSH) B;<br /> }<br /> default:<br /> return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);<br /> } <br /></pre></td> </tr> </tbody> </table> </div> </td> </tr> </tbody> </table> </div> <img src ="http://www.shnenglu.com/xbgs/aggbug/8940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/xbgs/" target="_blank">让心(j)飞翔</a> 2006-06-23 23:21 <a href="http://www.shnenglu.com/xbgs/archive/2006/06/23/8940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对话框中直接打印且保证打印内容连l的Ҏ(gu)http://www.shnenglu.com/xbgs/archive/2006/06/23/8939.html让心(j)飞翔让心(j)飞翔Fri, 23 Jun 2006 15:18:00 GMThttp://www.shnenglu.com/xbgs/archive/2006/06/23/8939.htmlhttp://www.shnenglu.com/xbgs/comments/8939.htmlhttp://www.shnenglu.com/xbgs/archive/2006/06/23/8939.html#Feedback0http://www.shnenglu.com/xbgs/comments/commentRss/8939.htmlhttp://www.shnenglu.com/xbgs/services/trackbacks/8939.html    在对话框E序的打印功能中Q如果用针式打印机Q那么你可能希望q箋打印的多个表中不换页。我们知道,在用打印功能的时候,每当 dc.startpage()׃(x)开始一늚打印Q而dc.endpage()׃(x)l束一늚打印Q那么如何能使多个dc.startpage()? dc.endpage()不换而实现连l打印呢Q方法如下:(x) 假设我们要打印m_nTotalNum个表Q每个表有m行,那么要实现m_nTotalNum个表q箋打印不换可以如下实玎ͼ(x)(׃打印机制问题Q在打满一张后是必要换页的,我们的做法是在换늚地方让给它留Z定的I白Q不太媄(jing)响表的连l?
/////////////d?/strong>
void CDlgTest::PrintOneNum() 
{
CDC dc;
CPrintDialog printDlg(FALSE);
CPrintInfo Info;
printDlg.GetDefaults();
dc.Attach(printDlg.GetPrinterDC());
dc.m_bPrinting=TRUE;
CString strTitle;
strTitle.LoadString(AFX_IDS_APP_TITLE);
DOCINFO di;
::ZeroMemory(&di,sizeof(DOCINFO));
di.cbSize=sizeof(DOCINFO);
di.lpszDocName=strTitle;
if(dc.m_hDC)
{
BOOL bPrintingOk=dc.StartDoc(&di);
CPrintInfo Info;
m_nCurrentNum_WhenPrint=1; //当前表数?,q个用来控制打印的表?/font>
int nPageTotalScale=0; //初始化从0开?/font>
Info.m_nCurPage=1; //从第一开?/font>
dc.StartPage(); //开始打印页
for(;;)
{
//打印完需要的表数m_nTotalNum则退出@?/font>
if(m_nCurrentNum_WhenPrint >m_nTotalNum) break;
else //打印一张表
{
nPageTotalScale=OnPrintReport (&dc,&Info,nPageTotalScale, m_nCurrentNum_WhenPrint);
m_nCurrentNum_WhenPrint ++;
nPageTotalScale+=30; //打印下一张表的行距从Q?0开?/font>
}
}
bPrintingOk=(dc.EndPage()>0); //l束一?/font>
m_nCurrentNum_WhenPrint =0;
if(bPrintingOk)
dc.EndDoc();
else
dc.AbortDoc();
}
else
{
MessageBox("h查打印机是否q接完好Q?,"我的E??,MB_ICONEXCLAMATION);
}
dc.Detach();
}

/////////////打印函数
int CdlgTest::OnPrintReport(CDC *pDC, CPrintInfo *pInfo, 
int nXBasePointWhenPrint, int m_nCurrentNum_WhenPrint)
{
int nXCurrentPoint=nXBasePointWhenPrint; //q行行控制的变量
//--------换页---------
if(nXCurrentPoint+210> 2000) //210为将要占用的长度
{
pDC->EndPage();
pDC->StartPage();
nXCurrentPoint=0;
pInfo->m_nCurPage++;
}
nXCurrentPoint+=210;
pDC->TextOut(0,nXCurrentPoint,"我的报表内容Q从0Q?10的表长度 ");
//每当打印的输换行的时候就要判断if(nXCurrentPoint+要使用的高?gt; 2000)2000定的一张纸的高度?如果大于U张高度p换页。这样就保证打印内容q箋?/font>
return nXCurrentPoint; //最后返回打印完当前表时当前的页面高度,
以便下一张表接着q个高度打印

}


让心(j)飞翔 2006-06-23 23:18 发表评论
]]>
GridCtrl使用详解http://www.shnenglu.com/xbgs/archive/2006/06/23/8936.html让心(j)飞翔让心(j)飞翔Fri, 23 Jun 2006 15:16:00 GMThttp://www.shnenglu.com/xbgs/archive/2006/06/23/8936.htmlhttp://www.shnenglu.com/xbgs/comments/8936.htmlhttp://www.shnenglu.com/xbgs/archive/2006/06/23/8936.html#Feedback12http://www.shnenglu.com/xbgs/comments/commentRss/8936.htmlhttp://www.shnenglu.com/xbgs/services/trackbacks/8936.html

 在单文档中的使用Ҏ(gu)
步骤一 初始?/font>

在CViewcȝ.h头文件中包含文g:
    #include "Gridctrl.h"

q且手写加入如下的成员函?
    CGridCtrl * m_pGridCtrl;

步骤二 构造与析构

构造函C:
   m_pGridCtrl = NULL;
析构函数?
   if(m_pGridCtrl)
       delete m_pGridCtrl;


步骤?如果需要打印功能的话添加同名打印函C?/font>

在CViewcȝOnBeginPrinting()函数中添加如下代?
if(m_pGridCtrl)
    m_pGridCtrl->OnBeginPrinting(pDC,pInfo);
//单吧,q就是类的好?br />
其它两个打印函数也一L(fng)做法.

步骤?在OnInitaUpdate()函数中或者你自己d的要昄Grid的消息函C如下初始?

   //创徏非模式对话框
CDlg *dlg;
dlg=new CDlg();
dlg->Create(IDD_Dlg,this);

//初始化GridCtrl控g
if(m_pGridCtrl!=NULL)
{
delete m_pGridCtrl;
m_pGridCtrl=NULL;
}
if (m_pGridCtrl == NULL)
{
// Create the Gridctrl object
m_pGridCtrl = new CGridCtrl;
if (!m_pGridCtrl) return 0;
// Create the Gridctrl window
CRect rect;
GetClientRect(rect);
m_pGridCtrl->Create(rect, this, 100);
// fill it up with stuff
m_pGridCtrl->SetEditable(false);
m_pGridCtrl->SetTextBkColor(RGB(0xFF, 0xFF, 0xE0)); //黄色背景
m_pGridCtrl->EnableDragAndDrop(false);
try {
m_pGridCtrl->SetRowCount(k); //讄行数为k?br /> m_pGridCtrl->SetColumnCount(4); //k?br /> m_pGridCtrl->SetFixedRowCount(1); //标题行ؓ(f)一?br /> m_pGridCtrl->SetFixedColumnCount(1); //同上
}
catch (CMemoryException* e)
{
e->ReportError();
e->Delete();
return 0;
}
//填充列标?br /> int row=0;
for(int col=0;col<4;col++)
{
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = row;
Item.col = col;
if(col==0){
Item.nFormat = DT_CENTER|DT_WORDBREAK;
Item.strText.Format(_T("【类别?),col);
}
else if(col==1){
Item.nFormat = DT_LEFT|DT_WORDBREAK;
Item.strText.Format(_T("W一?),col);
}
else if(col==2){
Item.nFormat = DT_LEFT|DT_WORDBREAK;
Item.strText.Format(_T("W二?),col);
}
m_pGridCtrl->SetItem(&Item);
}
// fill rows/cols with text
for (row = 1; row < k; row++)
for (col = 0; col < h; col++)
{
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = row;
Item.col = col;
if (col < 1) { //行标题头
Item.nFormat = DT_CENTER|DT_VCENTER
|DT_SINGLELINE|DT_END_ELLIPSIS
|DT_NOPREFIX;
Item.strText.Format(_T("%d"),row);
}
else if(col==1){ //W一列的?br /> Item.nFormat = DT_CENTER|DT_VCENTER
|DT_SINGLELINE|DT_END_ELLIPSIS
|DT_NOPREFIX;
str="aa";
Item.strText.Format(_T("%s"),str);
}else if(col==2){ //W二列第?br /> Item.nFormat = DT_CENTER|DT_VCENTER
|DT_SINGLELINE|DT_END_ELLIPSIS
|DT_NOPREFIX;
CString str;
str="bb";
Item.strText.Format(_T("%s"),str);
}
m_pGridCtrl->SetItem(&Item);
}
m_pGridCtrl->AutoSize();

//--------------讄行列?-----------------
for(int a=1;a<m;a++)
m_pGridCtrl->SetRowHeight(a,21); //讄各行?br /> m_pGridCtrl->SetRowHeight(0,24); //讄0行高
m_pGridCtrl->SetColumnWidth(1,110); //讄2列宽
m_pGridCtrl->SetColumnWidth(2,160); //讄3列宽
m_pGridCtrl->SetColumnWidth(3,100); //讄4列宽
}
上例取自实际工程,E有修改!
部分注释:
void SetVirtualMode(TRUE) //设ؓ(f)虚模?/font>
BOOL SetRowCount(int nRows) //讄ȝ行数?/font>
BOOL SetFixedRowCount(int nFixedRows = 1)//讄固定的行数据
BOOL SetColumnCount(int nCols) //讄列数
BOOL SetFixedColumnCount(int nFixedCols = 1)//讄固定的列?/font>


步骤? dWM_SIZE消息,调整控g的界面占屏幕大小

  if(m_pGridCtrl->GetSafeHWnd())
   {
      CRect rect;
     GetClientRect(rect);
     m_pGridCtrl->MoveWindow(rect);
   }



 在对话框中的使用Ҏ(gu)

步骤一 创徏数据昄表格对话?/font>

在资源管理器中新创徏一个对话框Q假设ؓ(f)CDlgTestReportBox?从工L(fng)中加入Custom ControlQ就是h头像的那个,其区域拉臌昄数据表格的大,充满整个对话框?/p>

在CDlgTestReportBoxcȝ头文件中Q?/p>

#include "GridCtrl.h"

再定义成员变量:(x)

CGridCtrl* m_pGrid;

dOnShowWindow()消息处理函数如下Q?/p>

void CDlgTestReportBox::OnShowWindow(BOOL bShow, UINT nStatus) 
{
CDialog::OnShowWindow(bShow, nStatus);
// TODO: Add your message handler code here
if(m_pGrid!=NULL)
{
delete m_pGrid;
m_pGrid=NULL;
}
if(m_pGrid==NULL)
{
m_pGrid=new CGridCtrl;
CRect rect;
GetDlgItem(IDC_ReportAera)->GetWindowRect(rect); //得到昄区域
ScreenToClient(&rect);
m_pGrid->Create(rect,this,100);
m_pGrid->SetEditable(false);
m_pGrid->SetTextBkColor(RGB(0xFF, 0xFF, 0xE0)); //黄色背景
try
{
m_pGrid->SetRowCount(10); //初始?0?br /> m_pGrid->SetColumnCount(11); //初始化ؓ(f)11?br /> m_pGrid->SetFixedRowCount(1); //表头Z?br /> m_pGrid->SetFixedColumnCount(1); //表头Z?
}
catch (CMemoryException* e)
{
e->ReportError();
e->Delete();
// return FALSE;
}
for (int row = 0; row < m_pGrid->GetRowCount(); row++)
for (int col = 0; col < m_pGrid->GetColumnCount(); col++)
{
//讄表格昄属?br /> GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = row;
Item.col = col;
if(row==0&&col==0) //W?0Q?)?br /> {
Item.nFormat = DT_CENTER|DT_WORDBREAK;
Item.szText.Format(_T("报表昄"),col);
}
else if (row < 1) //讄0行表头显C?br /> {
Item.nFormat = DT_CENTER|DT_WORDBREAK;
Item.szText.Format(_T(" 目%d"),col);
}
else if (col < 1) //讄0列表头显C?br /> {
if(row< m_pGrid->GetRowCount()-4)
{
Item.nFormat = DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS;
Item.szText.Format(_T("W?d?),row);
}
}
else
{
Item.nFormat = DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS;
Item.szText.Format(_T(""),2);
}
m_pGrid->SetItem(&Item);
}
m_pGrid->Invalidate();
}
//--------------讄行列?-----------------
for(int a=0;aGetRowCount();a++)
m_pGrid->SetRowHeight(a,16); //讄各行?
m_pGrid->SetColumnWidth(0,58); //讄0列宽
for(int b=1;bGetColumnCount();b++)
m_pGrid->SetColumnWidth(b,59); //讄各列?br />}

 

步骤二 嵌入上面的对话框 昄数据

在你需要显C数据的对话框上的头文g中,假设为CDlgTestQ加?/p>

#include "GridCtrl.h"

CDlgTestReportBox* m_pTestReportBox;

数据显C对话框攑օ你的对话框相应位|上Q在CDlgTest::OnInitDialog() 中:(x)

if(!m_pTestReportBox)
{
     m_pTestReportBox=new CDlgTestReportBox(this);
}

m_pTestReportBox->Create(IDD_DlgTestReportBox,this);

//定义区域变量
CRect rectDraw;
GetDlgItem(IDC_AeraReport)->GetWindowRect(rectDraw);
ScreenToClient(&rectDraw); //动态测试数据显C区域rectDraw

//对应的对话框放到指定区?/font>
m_pTestReportBox->MoveWindow(rectDraw);
m_pTestReportBox->ShowWindow(SW_SHOW);

自定义填充数据的函数QCDlgTest::FillGrid() 如下Q?/p>

CGridCtrl* pGrid=m_pTestReportBox->m_pGrid;
for (int row = pGrid->GetRowCount()-1; row >= pGrid->GetRowCount()-3; row--)
{
for (int col = 1; col <= pGrid->GetColumnCount(); col++)
{
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = row;
Item.col = col;
if(row==pGrid->GetRowCount()-3&&col>0) //q_?br /> {
if(col==10){
Item.nFormat = DT_CENTER|DT_WORDBREAK;
Item.szText.Format(_T(" %6.2f "),avjch);
}
else{
Item.nFormat = DT_CENTER|DT_WORDBREAK;
Item.szText.Format(_T(" %6.2f "),av[col-1]);
}
}
pGrid->SetItem(&Item); //提交数据
if(row==0||col==0)
{
COLORREF clr = RGB(0, 0, 0);
pGrid->SetItemBkColour(row, col, clr);
pGrid->SetItemFgColour(row, col, RGB(255,0,0));
}
}//循环l束
pGrid->Invalidate();
}
好篏?忙了(jin)一天时间终于写完了(jin)!




让心(j)飞翔 2006-06-23 23:16 发表评论
]]>
VC用ADO讉K数据库全ȝhttp://www.shnenglu.com/xbgs/archive/2006/06/23/8935.html让心(j)飞翔让心(j)飞翔Fri, 23 Jun 2006 15:14:00 GMThttp://www.shnenglu.com/xbgs/archive/2006/06/23/8935.htmlhttp://www.shnenglu.com/xbgs/comments/8935.htmlhttp://www.shnenglu.com/xbgs/archive/2006/06/23/8935.html#Feedback0http://www.shnenglu.com/xbgs/comments/commentRss/8935.htmlhttp://www.shnenglu.com/xbgs/services/trackbacks/8935.html一、ADO概述
ADO是Microsoft为最新和最强大的数据访问范?OLE DB 而设计的Q是一个便于用的应用E序层接口。ADO 使?zhn)能够~写应用E序以通过 OLE. DB 提供者访问和操作数据库服务器中的数据。ADO 最主要的优Ҏ(gu)易于使用、速度快、内存支出少和磁盘遗q小。ADO 在关键的应用Ҏ(gu)中用最的|络量Qƈ且在前端和数据源之间使用最的层数Q所有这些都是ؓ(f)?jin)提供轻量、高性能的接口。之所以称? ADOQ是用了(jin)一个比较熟(zhn)的暗喻QOLE 自动化接口?/div>
OLE DB是一l”组件对象模型?COM) 接口Q是新的数据库低层接口,它封装了(jin)ODBC的功能,q以l一的方式访问存储在不同信息源中的数据。OLE DB是Microsoft UDA(Universal Data Access){略的技术基。OLE DB ZQ何数据源提供?jin)高性能的访问,q些数据源包括关pd非关pL据库、电(sh)子邮件和文gpȝ、文本和囑Ş、自定义业务对象{等。也是_(d)OLE DB q不局限于 ISAM、Jet 甚至关系数据源,它能够处理Q何类型的数据Q而不考虑它们的格式和存储Ҏ(gu)。在实际应用中,q种多样性意味着可以讉Kȝ?Excel ?sh)子数据表、文本文件、电(sh)子邮?目录服务甚至邮g服务器,诸如 Microsoft Exchange 中的数据。但是,OLE DB 应用E序~程接口的目的是为各U应用程序提供最佳的功能Q它q不W合单化的要求。?zhn)需要的API 应该是一座连接应用程序和OLE DB 的桥梁,q就?ActiveX Data Objects (ADO)?
二、在VC中用ADO(开发步骤好下:(x))
1、引入ADO库文?
使用ADO前必d工程的stdafx.h头文仉用直接引入符?import引入ADO库文?以ɾ~译器能正确~译。代码如下所C:(x)
?import引入ADO库文?/div>
 
#import "c:\program files\common files\system\ado\msado15.dll"no_namespaces rename("EOF" adoEOF")
 
q行语句声明在工E中使用ADOQ但不用ADO的名字空_(d)q且Z(jin)避免常数冲突Q将常数EOF改名为adoEOF。现在不需d另外的头文gQ就可以使用ADO接口?jin)?
2、初始化OLE/COM库环?br />必须注意的是QADO库是一lCOM动态库Q这意味应用E序在调用ADO前,必须初始化OLE/COM库环境。在MFC应用E序里,一个比较好的方法是在应用程序主cȝInitInstance成员函数里初始化OLE/COM库环境?/div>
 
BOOL CMyAdoTestAppQ:(x)InitInstance()
{
if(!AfxOleInit())//q就是初始化COM?br />{
AfxMessageBox(“OLE初始化出??;
return FALSE;
}
…?
}
 
3、ADO接口?
ADO库包含三个基本接?_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口?br />_ConnectionPtr 接口q回一个记录集或一个空指针。通常使用它来创徏一个数据连接或执行一条不q回Ml果的SQL语句Q如一个存储过E。? _ConnectionPtr接口q回一个记录集不是一个好的用方法。对于要q回记录的操作通常用_RecordserPtr来实现。而用 _ConnectionPtr操作时要惛_到记录条数得遍历所有记录,而用_RecordserPtr时不需要?
_CommandPtr 接口q回一个记录集。它提供?jin)一U简单的Ҏ(gu)来执行返回记录集的存储过E和SQL语句。在使用_CommandPtr接口Ӟ你可以利用全局 _ConnectionPtr接口Q也可以在_CommandPtr接口里直接用连接串。如果你只执行一ơ或几次数据讉K操作Q后者是比较好的选择。但 如果你要频繁讉K数据库,q要q回很多记录集,那么Q你应该使用全局_ConnectionPtr接口创徏一个数据连接,然后使用_CommandPtr 接口执行存储q程和SQL语句?
_RecordsetPtr是一个记录集对象。与以上两种对象相比Q它对记录集提供?jin)更多的控制功能Q如记录锁定Q游标控制等。同 _CommandPtr接口一P它不一定要使用一个已l创建的数据q接Q可以用一个连接串代替q接指针赋给 _RecordsetPtr的connection成员变量Q让它自己创建数据连接。如果你要用多个记录集Q最好的Ҏ(gu)是同Command对象一样? 已经创徏?jin)数据连接的全局_ConnectionPtr接口
Q然后用_RecordsetPtr执行存储q程和SQL语句。 
4、用_ConnectionPtr接口
_ConnectionPtr主要是一个连接接口,取得与数据库的连接。它的连接字W串可以是自q接写Q也可以指向一个ODBC DSN?/div>
 
_ConnectionPtr pConn;
if (FAILED(pConn.CreateInstance("ADODB.Connection")))
{
AfxMessageBox("Create Instance failed!");
return;
}

CString strSRC;
strSRC="Driver=SQL Server;Server=";
strSRC+="suppersoft";
strSRC+=";Database=";
strSRC+="mydb";
strSRC+=";UID=SA;PWD=";
CString strSQL = "Insert into student(no,name,sex,address) values(3,'aaa','male','beijing')";
_variant_t varSRC(strSRC);
_variant_t varSQL(strSQL);
_bstr_t bstrSRC(strSRC);
if (FAILED(pConn->Open(bstrSRC,"","",-1)))
{
AfxMessageBox("Can not open Database!");
pConn.Release();
return;
}
COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
pConn->Execute(_bstr_t(strSQL),&vtOptional,-1);
pConn.Release();
AfxMessageBox("ok!");
 
5、用_RecordsetPtr接口(以连接SQL ServerZ)

_RecordsetPtr pPtr;
if (FAILED(pPtr.CreateInstance("ADODB.Recordset")))
{
AfxMessageBox("Create Instance failed!");
return FALSE;
}
CString strSRC;
strSRC="Driver=SQL Server;Server=";
strSRC+="210.46.141.145";
strSRC+=";Database=";
strSRC+="mydb";
strSRC+=";UID=sa;PWD=";
strSRC+="sa";
CString strSQL = "select id,name,gender,address from personal";
_variant_t varSRC(strSRC);
_variant_t varSQL(strSQL);
if(FAILED(pPtr->Open(varSQL,varSRC,adOpenStatic,adLockOptimistic,adCmdText)))
{
AfxMessageBox("Open table failed!");
pPtr.Release();
return FALSE;
}
while(!pPtr->GetadoEOF())
{
_variant_t varNo;
_variant_t varName;
_variant_t varSex;
_variant_t varAddress;
varNo = pPtr->GetCollect ("id");
varName = pPtr->GetCollect ("name");
varSex = pPtr->GetCollect ("gender");
varAddress = pPtr->GetCollect ("address");
CString strNo =(char *)_bstr_t(varNo);
CString strName =(char *)_bstr_t(varName);
CString strSex =(char *)_bstr_t(varSex);
CString strAddress =(char *)_bstr_t(varAddress);
strNo.TrimRight();
strName.TrimRight();
strSex.TrimRight();
strAddress.TrimRight();
int nCount = m_list.GetItemCount();
int nItem = m_list.InsertItem (nCount,_T(""));
m_list.SetItemText (nItem,0,strNo);
m_list.SetItemText (nItem,1,strName);
m_list.SetItemText (nItem,2,strSex);
m_list.SetItemText (nItem,3,strAddress);
pPtr->MoveNext();
}
pPtr->Close();
pPtr.Release();
 
6、用_CommandPtr接口
_CommandPtr接口q回一个Recordset对象Qƈ且提供了(jin)更多的记录集控制功能Q以下代码示例了(jin)使用_CommandPtr接口的方法:(x)
代码11:使用_CommandPtr接口获取数据
 
_CommandPtr pCommand;
_RecordsetPtr pRs;
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection=pConn;
pCommand->CommandText="select * from student";
pCommand->CommandType=adCmdText;
pCommand->Parameters->Refresh();
pRs=pCommand->Execute(NULL,NULL,adCmdUnknown);
_variant_t varValue = pRs->GetCollect("name");
Cstring strValue=(char*)_bstr_t(varValue);
 
7、关于数据类型{换由于COM对象是跨q_的,它用了(jin)一U通用的方法来处理各种cd的数据,
因此Cstring cdCOM对象是不兼容的,我们需要一lAPI来{换COM对象和C++cd的数据。_vatiant_t和_bstr_t是q样两种对象。它们提供了(jin)通用的方法{换COM对象和C++cd的数据?/div>

让心(j)飞翔 2006-06-23 23:14 发表评论
]]>Forms2.0pd的控件无法在未安装OFFICE的机器上q行http://www.shnenglu.com/xbgs/archive/2006/06/23/8934.html让心(j)飞翔让心(j)飞翔Fri, 23 Jun 2006 15:11:00 GMThttp://www.shnenglu.com/xbgs/archive/2006/06/23/8934.htmlhttp://www.shnenglu.com/xbgs/comments/8934.htmlhttp://www.shnenglu.com/xbgs/archive/2006/06/23/8934.html#Feedback0http://www.shnenglu.com/xbgs/comments/commentRss/8934.htmlhttp://www.shnenglu.com/xbgs/services/trackbacks/8934.html    Forms2.0pd的控Ӟ? Microsoft forms 2.0 label Q?/font>Microsoft forms 2.0 commandbutton{?其依赖的动态链接库?font color="#660099">Fm20.dlls。在使用q程中我发现Q如?/font>在发布Y件的时候,用户的客h上没有安装word的话Q程序就不能q行(虽然E序q行?jin),但是看不到界面出??后来在网上搜索了(jin)很多资料Q终于找C(jin)问题的关键,在微软网站上扑ֈ关于q个问题的解释ؓ(f)Q?Fm20.dlls 不是可以重分配的Q你必须安装一个象OFFICE97那样的系l在你的目标客户Z作ؓ(f)你Y件分发的一部分?如果不安装Microsoft Office 97那样的系l的话,即你用regsvr32注册都没有作?/font>(我翻译的,有点不通顺哦^_^)?/font>
    最l的解决办法是Q做为Microsoft Office 97的替代,你可以免费下载和安装Microsoft ActiveX Control Pad. 安装完毕Q客h上就可以无需安装office而用你的程序了(jin)。[需要的L(fng)下email,我会(x)发给你的]


让心(j)飞翔 2006-06-23 23:11 发表评论
]]>CTypedPtrMap模板指针cȝ用法http://www.shnenglu.com/xbgs/archive/2006/06/23/8933.html让心(j)飞翔让心(j)飞翔Fri, 23 Jun 2006 15:07:00 GMThttp://www.shnenglu.com/xbgs/archive/2006/06/23/8933.htmlhttp://www.shnenglu.com/xbgs/comments/8933.htmlhttp://www.shnenglu.com/xbgs/archive/2006/06/23/8933.html#Feedback0http://www.shnenglu.com/xbgs/comments/commentRss/8933.htmlhttp://www.shnenglu.com/xbgs/services/trackbacks/8933.html下面是我在编E中q用CTypedPtrMap指针模板cȝҎ(gu)Q其存储l构占用物理I间,比单U的用数l结构存储的文g小很多Q所以是一U非常推荐的存储?qing)读取文件的?gu)?/p>

你必dstdafx.h文g?包含  #include <afxtempl.h>    // MFC templates
在头文g中包含?#include <io.h>

其中 CBank.h文g如下Q?br />

class CBank : public CObject  
{
DECLARE_SERIAL(CBank)   //声明序列化存?br />public:
       CBank();
       CBank(CString str){ m_bankname = str; }
       CBank(const CBank &b){ m_bankname= b.m_bankname;} //拯构造函?br />        virtual ~CBank();
private:
       CString  m_bankname;
public:
    virtual void Serialize(CArchive& ar);
};

typedef CTypedPtrMap<CMapStringToOb,

                     CString,

                     CBank*>CBanktmp;  //q个才是我们Ҏ(gu)此类生成的类?/p>

它的实现文g.cpp如下Q?br />

IMPLEMENT_SERIAL(CBank, CObject, 1)   //实现序列化存?br />CBank::CBank()
{
    m_bankname="";
}
CBank::~CBank()
{

}
void CBank::Serialize(CArchive& ar)
{
    if (ar.IsLoading())
    {
        ar >> m_bankname;
    }
    else
    {
        ar << m_bankname;
    }
}

/*----------------------------------------------------
从文件中d参数Q?br />注意Q?其中的m_map是这样定义的Q?font color="#0000ff">CBanktmp  m_map;

-------------------------------------------------*/

void CDlgBankIn::LoadBankName()
{
       UINT  nFlags = CFile::typeBinary |CFile::modeReadWrite;
       if(_access(_T("BankName.dat"),0))
       {
              nFlags |= CFile::modeCreate;
       }
       CFile file;
       CFileException fe;
       if (file.Open(_T("BankName.dat"),nFlags, &fe))
       {
           if(file.GetLength()==0)   //如果文g为空则不q行d操作
           {
           }
           else
           {
                CArchive ar(&file, CArchive::load);
                m_map.Serialize(ar);   //d文g
               //Ҏ(gu)文g内容填充列表?br />                POSITION   pos;
                CString    strKey;
                CBank   *pB=NULL;
                for( pos = m_map.GetStartPosition(); pos != NULL; )
                {
                    m_map.GetNextAssoc(pos,strKey,(CBank*)pB);
                    m_CmbBank.AddString(strKey);
                }
                delete  pB;
              }
       }
       file.Close();
}

/*-------------------------------------------------
功能: 先打开文g,然后查找文g中是否有与编辑框关键字相同的内容,
       如果有相同内容则不添?如果没有相同内容则写文g.
------------------------------------- ------------*/

void CDlgBankList::OnBtnAdd() 
{
       // TODO: Add your control notification handler code here
       CString  strKey;
       GetDlgItemText(IDC_EDITBank,strKey);
       if (0 != strKey.GetLength())
       {
          CBank  *pB;
          //打开文g
         UINT  nFlags = CFile::typeBinary |CFile::modeRead;
          CFile file;
          CFileException fe;
          if (file.Open(_T("BankName.dat"),nFlags, &fe))
          {
                 if(file.GetLength()==0)  //如果文g为空则不q行序列化操?br />                 {

                 }
                 else
                 {
                  CArchive ar(&file, CArchive::load);
                  m_map.Serialize(ar);
                 }
               //分析文gq给文gd~辑框的内容
                if(!m_map.Lookup(strKey,(CBank*)pB))  //当不存在时才需要添?br />                  {
                      if (CB_ERR != m_ListBox.AddString(strKey))
                      {
                         m_map.SetAt(strKey, new CBank(strKey));  //l关键字strKey赋?br />                      }
                 }
          }
       file.Close();

       //存储文g
     nFlags = CFile::typeBinary |CFile::modeWrite;
       if (file.Open(_T("BankName.dat"),nFlags, &fe))
       {
            CArchive ar(&file, CArchive::store);
            m_map.Serialize(ar);   //序列化存?br />     }
    }
}

/*-------------------------------------------------
功能: 先打开文g,然后查找文g中的关键?
    扑ֈ后则删除此关键字, 但是注意关键字对应的内容仍然没有删除Q这Ҏ(gu)待改q?
-------------------------------------------------*/

void CDlgBankList::OnBtnDel() 
{
       // TODO: Add your control notification handler code here
       int iIndex;      
       CString  strKey;
       if(LB_ERR!=m_ListBox.GetCurSel())
       {
        //打开文g
     & nbsp;     UINT  nFlags = CFile::typeBinary |CFile::modeRead;
           CFile file;
           CFileException fe;
           if (file.Open(_T("BankName.dat"),nFlags, &fe))
           {
              CArchive ar(&file, CArchive::load);
              m_map.Serialize(ar); 
              iIndex=m_ListBox.GetCurSel();
              m_ListBox.GetText(iIndex,strKey);
              m_ListBox.DeleteString(iIndex);
              //分析文gq给文gd~辑框的内容
               CBank  *pB=NULL;
              if(m_map.Lookup(strKey,(CBank*)pB))
              {
                  m_map.RemoveKey(strKey);   //删除关键?但没有删除关键字对应的内?br />               }
            }
            file.Close();
            //存储文g
           nFlags = CFile::typeBinary |CFile::modeWrite;
           if (file.Open(_T("BankName.dat"),nFlags, &fe))
           {
                CArchive ar(&file, CArchive::store);
                m_map.Serialize(ar);   //序列化存?br />           }
       }
}



让心(j)飞翔 2006-06-23 23:07 发表评论
]]> 99ƷۺϾþþþ | Ʒþþþ9999| ߳þѹۿ| 97Ʒ˾þô߽app | þþƷһWWW| ƬҹƬþ| ܻƺ۵վþmimiɫ | þòӰ| þù| ޾Ʒ˾þþ| ƷһþþƷɬ| ŷձþùʵҶ԰| þþ| þþƷר| պþþþĻ| þþƷƵһ| þþŮһ| 99þùۺϾƷ鶹| ˾Ʒþۺ| ƷžžþƵ | þWWW˳ɡƬ| þþɫۺϾɫ99| þþþ99оƷ10| ƷþþĻ| ŷһþ| þһۺ| þþþAV鶹| þŮվ| þֻоƷҳ| þþƷŷպƷ| þۺϾɫŷۺϺݺ| þۺϾþ߾Ʒ| ˾ƷۺϾþþ| ĻþþƷ| ƷѸþ| Ļ޹˾þþƷ| þþþ޾Ʒһ | þѿaëƬ| Ʒþþþþø| ޹˾Ʒ91þþ | Ʒþþþþ޾Ʒ|