<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://tonyvista.spaces.live.com/mmm2008-05-08_20.17/rsspretty.aspx?rssquery=en-US;http%3a%2f%2ftonyvista.spaces.live.com%2fcategory%2fMFC%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>明年今日: MFC</title><description /><link>http://tonyvista.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catMFC</link><language>en-US</language><pubDate>Wed, 14 May 2008 08:25:45 GMT</pubDate><lastBuildDate>Wed, 14 May 2008 08:25:45 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://tonyvista.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>-6837717233776441331</live:id><live:alias>tonyvista</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>在内存设备上下文中作图并存为BMP</title><link>http://tonyvista.spaces.live.com/Blog/cns!A11B8C675630480D!2405.entry</link><description>&lt;p&gt;      乱七八糟弄了好久才搞定。 &lt;p&gt;        HDC hDC = ::GetDC(NULL);    //屏幕DC&lt;br&gt;        CDC MemDC;                    //内存DC&lt;br&gt;        MemDC.CreateCompatibleDC(CDC::FromHandle(hDC));    //创建和屏幕兼容的内存设备&lt;br&gt;        CBitmap Bitmap, *pOldBitmap;&lt;br&gt;        Bitmap.CreateCompatibleBitmap(CDC::FromHandle(hDC), m_dbGridWidth, m_dbGridHeight);    //创建位图&lt;br&gt;        pOldBitmap = (CBitmap *)MemDC.SelectObject(&amp;amp;Bitmap);    //选入内存设备&lt;br&gt;        MemDC.FillSolidRect(m_rectClient,RGB(255,255,255));    //填充位图背景为白色  &lt;p&gt;        DrawGrid(&amp;amp;MemDC);&lt;br&gt;        DrawLabel(&amp;amp;MemDC);&lt;br&gt;        DrawPresetLine(&amp;amp;MemDC);&lt;br&gt;        DrawActualLine(&amp;amp;MemDC);  &lt;p&gt;        MemDC.SelectObject(pOldBitmap);&lt;br&gt;        ::ReleaseDC(NULL, hDC);&lt;br&gt;        HBITMAP hBitmap = (HBITMAP)Bitmap.m_hObject;&lt;br&gt;        SaveBitmapToFile(hBitmap,strBmpName);    //保存为BMP &lt;p&gt;下面是SaveBitmapToFile函数： &lt;p&gt;BOOL SaveBitmapToFile(HBITMAP hBitmap,LPCTSTR lpFileName)&lt;br&gt;{&lt;br&gt;    HDC hDC; //设备描述表&lt;br&gt;    int iBits; //当前显示分辨率下每个像素所占字节数&lt;br&gt;    WORD wBitCount; //位图中每个像素所占字节数&lt;br&gt;    DWORD dwPaletteSize = 0, //定义调色板大小， 位图中像素字节大小 ，位图文件大小 ， 写入文件字节数&lt;br&gt;          dwBmBitsSize,&lt;br&gt;          dwDIBSize, &lt;br&gt;          dwWritten;&lt;br&gt;    BITMAP Bitmap; //位图属性结构&lt;br&gt;    BITMAPFILEHEADER bmfHdr; //位图文件头结构&lt;br&gt;    BITMAPINFOHEADER bi; //位图信息头结构&lt;br&gt;    LPBITMAPINFOHEADER lpbi; //指向位图信息头结构  &lt;p&gt;    HANDLE fh, hDib, hPal,hOldPal = NULL; //定义文件，分配内存句柄，调色板句柄  &lt;p&gt;    //计算位图文件每个像素所占字节数&lt;br&gt;    HDC hWndDC = CreateDC(&amp;quot;DISPLAY&amp;quot;,NULL,NULL,NULL);&lt;br&gt;    hDC = ::CreateCompatibleDC(hWndDC) ;&lt;br&gt;    iBits = GetDeviceCaps(hDC,BITSPIXEL) * GetDeviceCaps(hDC,PLANES);&lt;br&gt;    DeleteDC(hDC);  &lt;p&gt;    if (iBits &amp;lt;= 1)&lt;br&gt;        wBitCount = 1;&lt;br&gt;    else if (iBits &amp;lt;= 4)&lt;br&gt;        wBitCount = 4;&lt;br&gt;    else if (iBits &amp;lt;= 8)&lt;br&gt;        wBitCount = 8;&lt;br&gt;    else if (iBits &amp;lt;= 24)&lt;br&gt;        wBitCount = 24;&lt;br&gt;    else&lt;br&gt;        wBitCount = 24 ;  &lt;p&gt;    //计算调色板大小&lt;br&gt;    if (wBitCount &amp;lt;= 8)&lt;br&gt;        dwPaletteSize = (1 &amp;lt;&amp;lt; wBitCount) * sizeof(RGBQUAD);  &lt;p&gt;    //设置位图信息头结构&lt;br&gt;    GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&amp;amp;Bitmap);&lt;br&gt;    bi.biSize = sizeof(BITMAPINFOHEADER);&lt;br&gt;    bi.biWidth = Bitmap.bmWidth;&lt;br&gt;    bi.biHeight = Bitmap.bmHeight;&lt;br&gt;    bi.biPlanes = 1;&lt;br&gt;    bi.biBitCount = wBitCount;&lt;br&gt;    bi.biCompression = BI_RGB;&lt;br&gt;    bi.biSizeImage = 0;&lt;br&gt;    bi.biXPelsPerMeter = 0;&lt;br&gt;    bi.biYPelsPerMeter = 0;&lt;br&gt;    bi.biClrUsed = 0;&lt;br&gt;    bi.biClrImportant = 0;  &lt;p&gt;    dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32) * 4 * Bitmap.bmHeight ;  &lt;p&gt;    //为位图内容分配内存&lt;br&gt;    hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));&lt;br&gt;    lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);&lt;br&gt;    *lpbi = bi;  &lt;p&gt;    // 处理调色板&lt;br&gt;    hPal = GetStockObject(DEFAULT_PALETTE);&lt;br&gt;    if (hPal)&lt;br&gt;    {&lt;br&gt;        hDC = ::GetDC(NULL);&lt;br&gt;        hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);&lt;br&gt;        RealizePalette(hDC);&lt;br&gt;    }  &lt;p&gt;    // 获取该调色板下新的像素值&lt;br&gt;    GetDIBits(hDC, //设备上下文句柄&lt;br&gt;        hBitmap,    //bitmap句柄&lt;br&gt;        0,            //起始行&lt;br&gt;        (UINT)Bitmap.bmHeight,    //总行数&lt;br&gt;        (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize,    //位图像素数组地址&lt;br&gt;        (LPBITMAPINFO)lpbi,    //位图数据结构地址&lt;br&gt;        DIB_RGB_COLORS);  &lt;p&gt;    //恢复调色板&lt;br&gt;    if (hOldPal)&lt;br&gt;    {&lt;br&gt;        SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);&lt;br&gt;        RealizePalette(hDC);&lt;br&gt;        ::ReleaseDC(NULL, hDC);&lt;br&gt;    }  &lt;p&gt;    //创建位图文件&lt;br&gt;    fh = CreateFile(lpFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,&lt;br&gt;        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);  &lt;p&gt;    if (fh == INVALID_HANDLE_VALUE)&lt;br&gt;        return FALSE;  &lt;p&gt;    // 设置位图文件头&lt;br&gt;    bmfHdr.bfType = 0x4D42; // &amp;quot;BM&amp;quot;&lt;br&gt;    dwDIBSize = sizeof(BITMAPFILEHEADER)&lt;br&gt;    + sizeof(BITMAPINFOHEADER)&lt;br&gt;    + dwPaletteSize + dwBmBitsSize;&lt;br&gt;    bmfHdr.bfSize = dwDIBSize;&lt;br&gt;    bmfHdr.bfReserved1 = 0;&lt;br&gt;    bmfHdr.bfReserved2 = 0;&lt;br&gt;    bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)&lt;br&gt;    + (DWORD)sizeof(BITMAPINFOHEADER)&lt;br&gt;    + dwPaletteSize;  &lt;p&gt;    // 写入位图文件头&lt;br&gt;    WriteFile(fh, (LPSTR)&amp;amp;bmfHdr, sizeof(BITMAPFILEHEADER), &amp;amp;dwWritten, NULL);  &lt;p&gt;    // 写入位图文件其余内容&lt;br&gt;    WriteFile(fh, (LPSTR)lpbi, dwDIBSize,&lt;br&gt;    &amp;amp;dwWritten, NULL);  &lt;p&gt;    //清除&lt;br&gt;    GlobalUnlock(hDib);&lt;br&gt;    GlobalFree(hDib);&lt;br&gt;    CloseHandle(fh);  &lt;p&gt;    return TRUE;&lt;br&gt;}&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-6837717233776441331&amp;page=RSS%3a+%e5%9c%a8%e5%86%85%e5%ad%98%e8%ae%be%e5%a4%87%e4%b8%8a%e4%b8%8b%e6%96%87%e4%b8%ad%e4%bd%9c%e5%9b%be%e5%b9%b6%e5%ad%98%e4%b8%baBMP&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=tonyvista.spaces.live.com&amp;amp;GT1=tonyvista"&gt;</description><comments>http://tonyvista.spaces.live.com/Blog/cns!A11B8C675630480D!2405.entry#comment</comments><guid isPermaLink="true">http://tonyvista.spaces.live.com/Blog/cns!A11B8C675630480D!2405.entry</guid><pubDate>Wed, 08 Aug 2007 02:35:42 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://tonyvista.spaces.live.com/blog/cns!A11B8C675630480D!2405/comments/feed.rss</wfw:commentRss><wfw:comment>http://tonyvista.spaces.live.com/Blog/cns!A11B8C675630480D!2405.entry#comment</wfw:comment><dcterms:modified>2007-08-08T02:35:42Z</dcterms:modified></item><item><title>MFC中创建控件数组</title><link>http://tonyvista.spaces.live.com/Blog/cns!A11B8C675630480D!2279.entry</link><description>&lt;p&gt;      做评分管理系统的时候需要在SDI的View里放很多之前做的的Station控件，而且数量是应该可以随时调整的，所以只能用控件数组的方式，但是MFC里面没有VB那样的控件数组，只能自己做了。经过试验，可以用如下方法：&lt;br&gt;      1、在View类头文件中增加CStationControl* m_pStationControl[50];&lt;br&gt;           这里CStationControl是控件的类，50是最大控件数。&lt;br&gt;      2、在构造函数中加入&lt;br&gt;           m_nStationNum = 5;&lt;br&gt;           for (int i = 0; i &amp;lt; m_nStationNum; i++)&lt;br&gt;                 m_pStationControl[i] = new CStationControl;&lt;br&gt;           为控件数组的m_nStationNum个元素new出实例。&lt;br&gt;      3、在View的OnInitialUpdate()里加入&lt;br&gt;           for (int i=0; i &amp;lt; m_nStationNum; i++)&lt;br&gt;                 m_pStationControl[i]-&amp;gt;Create(&amp;quot;Station&amp;quot;+i,WS_CHILD|WS_VISIBLE,CRect(10 + 100 * i,10,100 + 100 * i,70),this,IDC_STATION1+i);&lt;br&gt;           其中就是Create中的nID容易出问题，这里用IDC_STATION1+i来指定每一个控件的nID。而IDC_STATION1要在View菜单的Resource Symbols里New一个，Value可以随便设，只要保证从Value到Value+50都没有用上就行了。&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-6837717233776441331&amp;page=RSS%3a+MFC%e4%b8%ad%e5%88%9b%e5%bb%ba%e6%8e%a7%e4%bb%b6%e6%95%b0%e7%bb%84&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=tonyvista.spaces.live.com&amp;amp;GT1=tonyvista"&gt;</description><comments>http://tonyvista.spaces.live.com/Blog/cns!A11B8C675630480D!2279.entry#comment</comments><guid isPermaLink="true">http://tonyvista.spaces.live.com/Blog/cns!A11B8C675630480D!2279.entry</guid><pubDate>Tue, 12 Jun 2007 04:20:46 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://tonyvista.spaces.live.com/blog/cns!A11B8C675630480D!2279/comments/feed.rss</wfw:commentRss><wfw:comment>http://tonyvista.spaces.live.com/Blog/cns!A11B8C675630480D!2279.entry#comment</wfw:comment><dcterms:modified>2007-06-13T03:51:36Z</dcterms:modified></item></channel></rss>