1. 升级到2.1之后,发现WYSIWYG编辑器有点问题,段落前的空格总是没有
2. 用windows live writer不能发布嵌入的图片
2007-01-31
WordPress 系统的问题
2007-01-26
OwnerDraw HeaderCtrl
code.screen, div.codescreen{
font-family: monospace;
font-size: 1em;
display: block;
padding: 10px;
border: 1px solid #bbb;
background-color: #eee;
color: #000;
overflow: auto;
border-radius: 2.5px;
-moz-border-radius: 2.5px;
margin: 0.5em 2em;
}
Although many people don’t like MFC, sometimes we have to use it. This article presents a sample to describe how to implement height adjustment and owner drawing for HeaderControl of ListControl.
Header file:
class CSkinManager; class COwnerDrawHeaderCtrl : public CHeaderCtrl { public: COwnerDrawHeaderCtrl(); protected: virtual void DrawItem(LPDRAWITEMSTRUCT); protected: //{{AFX_MSG(COwnerDrawHeaderCtrl) afx_msg LRESULT OnLayout(WPARAM wParam, LPARAM lParam); afx_msg void OnPaint(); afx_msg BOOL OnEraseBkgnd(CDC* pDC); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: CSkinManager &m_skinManager; };
Source file:
COwnerDrawHeaderCtrl::COwnerDrawHeaderCtrl() :m_skinManager(CPootaoClientService::Instance().GetSkinManager()) { }; BEGIN_MESSAGE_MAP(COwnerDrawHeaderCtrl, CHeaderCtrl) //{{AFX_MSG_MAP(COwnerDrawHeaderCtrl) ON_MESSAGE(HDM_LAYOUT, OnLayout) ON_WM_PAINT() ON_WM_ERASEBKGND() //}}AFX_MSG_MAP END_MESSAGE_MAP() LRESULT COwnerDrawHeaderCtrl::OnLayout( WPARAM wParam, LPARAM lParam ) { HDLAYOUT* pLayout = ( HDLAYOUT* ) lParam; // cast the lParam pLayout->pwpos->hwnd = GetSafeHwnd (); // populate WINDOWPOS struct pLayout->pwpos->hwndInsertAfter = HWND_TOP; pLayout->pwpos->flags = SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED; int nHdrBottom = m_skinManager.m_sizeHeaderBackground.cy; pLayout->pwpos->x = pLayout->prc->left; pLayout->pwpos->y = 0; pLayout->pwpos->cx = pLayout->prc->right - pLayout->prc->left; pLayout->pwpos->cy = nHdrBottom; pLayout->prc->top = nHdrBottom; return TRUE; } void COwnerDrawHeaderCtrl::DrawItem(LPDRAWITEMSTRUCT) { } BOOL COwnerDrawHeaderCtrl::OnEraseBkgnd(CDC* pDC) { return FALSE; } void COwnerDrawHeaderCtrl::OnPaint() { CPaintDC dc(this); HDC dcMem = dc.m_hDC; CRect rectWindow; GetClientRect(&rectWindow); HFONT hOldFont = (HFONT)SelectObject(dcMem, GetStockObject(DEFAULT_GUI_FONT)); ::SetBkColor(dcMem, GetSysColor(COLOR_WINDOW)); SetBkMode(dcMem, TRANSPARENT); //draw the contents to a memory device context HDC dcMemBk = ::CreateCompatibleDC(dc.m_hDC); HBITMAP hOldBitmapBk = (HBITMAP)SelectObject(dcMemBk, m_skinManager.m_hBmpHeaderBackground); int rightMost = 0; for (int i=0; i<GetItemCount(); i++) { HDITEM hdi; TCHAR lpBuffer[256]; hdi.mask = HDI_TEXT | HDI_FORMAT | HDI_IMAGE | HDI_ORDER; hdi.pszText = lpBuffer; hdi.cchTextMax = 256; GetItem(i, &hdi); CRect rcItem; GetItemRect(i, &rcItem); SelectObject(dcMemBk, m_skinManager.m_hBmpHeaderSep); BitBlt(dcMem , rcItem.left, rcItem.top , m_skinManager.m_sizeHeaderSep.cx, m_skinManager.m_sizeHeaderSep.cy , dcMemBk, 0, 0, SRCCOPY); SelectObject(dcMemBk, m_skinManager.m_hBmpHeaderBackground); StretchBlt(dcMem , rcItem.left + 1, rcItem.top , rcItem.Width()-1, rcItem.Height() , dcMemBk , 0, 0, m_skinManager.m_sizeHeaderBackground.cx, m_skinManager.m_sizeHeaderBackground.cy , SRCCOPY); SelectObject(dcMemBk, m_skinManager.m_hBmpHeaderSep); BitBlt(dcMem , rcItem.right, rcItem.top , m_skinManager.m_sizeHeaderSep.cx, m_skinManager.m_sizeHeaderSep.cy , dcMemBk, 0, 0, SRCCOPY); rightMost = max(rightMost, rcItem.right); DRAWITEMSTRUCT DrawItemStruct; GetItemRect(i, &rcItem); DrawItemStruct.CtlType = 100; DrawItemStruct.hDC = dc.GetSafeHdc(); DrawItemStruct.itemAction = ODA_DRAWENTIRE; DrawItemStruct.hwndItem = GetSafeHwnd(); DrawItemStruct.rcItem = rcItem; DrawItemStruct.itemID = i; DrawItem(&DrawItemStruct); // Draw the items text using the text color. COLORREF crOldColor = ::SetTextColor(dcMem, RGB(0x4f,0x4f,0x4f)); SetBkMode(dcMem, TRANSPARENT); UINT uFormat = DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX|DT_END_ELLIPSIS; if( hdi.fmt & HDF_CENTER) uFormat |= DT_CENTER; else if( hdi.fmt & HDF_RIGHT) uFormat |= DT_RIGHT; else uFormat |= DT_LEFT; CRect rectText(rcItem); CPoint ptImage(0, 0); CImageList *imageList = NULL; if (hdi.fmt & HDF_IMAGE && (imageList = GetImageList()) != NULL) { IMAGEINFO imageInfo; if (imageList->GetImageInfo(hdi.iImage, &imageInfo)) { if (!(hdi.fmt & HDF_BITMAP_ON_RIGHT)) { ptImage = rcItem.TopLeft(); ptImage.x += 4; ptImage.y = rcItem.top + (rcItem.Height()-(imageInfo.rcImage.bottom-imageInfo.rcImage.top))/2; imageList->Draw(&dc, hdi.iImage, ptImage, ILD_TRANSPARENT); rectText.left += imageInfo.rcImage.right-imageInfo.rcImage.left+4; } else { rectText.right -= imageInfo.rcImage.right-imageInfo.rcImage.left+4; } } ::SetTextColor(dcMem, RGB(0x00,0x00,0x00)); } rectText.DeflateRect(4, 2, 4, 2); int nTextSize = ::DrawText(dcMem, lpBuffer, lstrlen(lpBuffer), &rectText, uFormat); ::SetTextColor(dcMem, crOldColor); if (hdi.fmt & HDF_IMAGE && imageList != NULL) { IMAGEINFO imageInfo; if (hdi.fmt & HDF_BITMAP_ON_RIGHT && imageList->GetImageInfo(hdi.iImage, &imageInfo)) { CSize sizeText; GetTextExtentPoint(dcMem, lpBuffer, lstrlen(lpBuffer), &sizeText); ptImage = CPoint(min(rectText.right + sizeText.cx + 16, rcItem.left + rcItem.Width()-(imageInfo.rcImage.right-imageInfo.rcImage.left)-4) , (rcItem.Height()-(imageInfo.rcImage.bottom-imageInfo.rcImage.top))/2); imageList->Draw(&dc, hdi.iImage, ptImage, ILD_TRANSPARENT); } } } SelectObject(dcMemBk, m_skinManager.m_hBmpHeaderBackground); StretchBlt(dcMem , rightMost+1, 0 , rectWindow.Width()-rightMost-1, rectWindow.Height() , dcMemBk , 0, 0, m_skinManager.m_sizeHeaderBackground.cx, m_skinManager.m_sizeHeaderBackground.cy , SRCCOPY); SelectObject(dcMemBk, hOldBitmapBk); DeleteDC(dcMemBk); }
"Add Hardware" on Redhat Linux
During redhat is booting, system will detect new hardwares automatically. If you choose “Keep configuration” or “Do nothing”, system may not run correctly. Don’t regret, run “/usr/sbin/kudzu” under terminal, new hardwares and removed hardwares will be detected again, then you will have another chance to make a better decision.
2007-01-25
2007-01-24
焦叶泰餐厅
昨晚给大黄同学庆生,fb地点为中关村广场金融中心的焦叶泰餐厅,在鼎好的西南。吃得还好,关键是氛围很不错,有好几个长得很原汁原味的泰国人拿着饭勺当麦克风唱歌跳舞,蛮好听的。有个女的问我们are you chinese,难道我们长得不像?她说她是Philippine。呵呵,让我这个思想不正的人想到菲佣了,实在不好意思了。
2007-01-23
2007-01-22
windows环境中的linux环境 —— cygwin
第一次接触cygwin(http://cygwin.com/)已经是5年前了。windows的优点就是:傻瓜式,在windows下拥有一个linux环境还是很酷的。譬如查找文件内容,习惯了用grep的会很讨厌用windows的explorer自带的搜索功能,太弱智了,而且bug不老少的,记得有次我好心好意地写邮件给M$说明bug情况,他们居然回邮件啥都不说就问我要客户号,晕啊,扯远了……
cygwin提供了一个叫做cygwin1.dll的dll,这个dll提供了linux API模拟层。很多linux上常用的工具都能基于cygwin上运行,譬如make、gcc等等,甚至gnome。
远程linux上运行一些程序譬如oracle的安装程序需要图形界面时,用cygwin就能轻松搞定。
先在本地启动X服务器:
$ XWin.exe -ac -multiwindow &
再在远程linux上设置环境变量:
$ export DISPLAY=:0.0
之后就可在远程linux上运行程序,在本地的窗口中操作程序的图形界面了。
如果想操作远程linux的桌面:
本地运行:
$ XWin.exe -ac &
再远程linux上设置好DISPLAY之后,运行
$ gnome-wm & # 这是窗口管理器
$ gnome-panel & # 这是gnome的任务条之类的管理程序
2007-01-16
制作RHEL 4 update 4的DVD安装盘
现在已经是DVD时代了,带着5张安装盘,安装的时候还得换来换去的觉得太麻烦,于是考虑做个DVD的安装盘。网上的资料都是说的在linux下做的,有点麻烦。在这儿记录一下如何在windows做:
1. 准备数据目录:
mkdir DVD
2. 用daemon-tools虚拟光驱mount上4个iso文件(我现在用的v4.03最多只能虚拟出4个光驱)。从第5张到第2张分别对应l、m、n和o盘。运行命令:
rsync -aurv /cygdrive/{l,m,n,o}/* DVD/
再在l盘mount第1张盘之后运行命令:
rsync -aurv /cygdrive/l/* DVD/
3. 将第一张盘中的.discinfo文件拷到DVD目录下,并将第4行修改为:
1,2,3,4,5
4. 用magicISO新建一个iso,从DVD\isolinux\isolinux.bin文件生成启动信息,把DVD目录下所有文件加进来。然后存盘。