taocoding


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

一些步入正轨

发表于 2009-04-07 | 分类于 生活轨迹

最近被电脑折腾得不行了,希望这次没有任何问题了,生活和学习也该步入正轨了。

附记今天看到的,TCP三路握手:

建立一个TCP连接:

(1)服务器准备接受客户端的连接

(2)客户端向服务器发起连接请求。此时客户端TCP发送一个SYN分节。

(3)服务器确认客户端的SYN(同步),同时也发送一个SYN分节。服务器以单个分节向客户端发送SYN和对客户端的SYN的ACK(确认)。

(4)客户端确认服务器的SYN。

此乃TCP的三路握手(three-way-handshake).

 

这个概念应该是在学习计算机网络时就讲过的,而其还是很详细的,但是现在在工作中看到感觉还是不一样。

Dialog注意事项

发表于 2009-03-17 | 分类于 VC

在CodeProject上面有两篇关于对话框的文章写得很不错,

http://www.codeproject.com/KB/dialog/gettingmodeless.aspx关于Modeless的,

http://www.codeproject.com/KB/dialog/dlgboxtricks.aspx关于Dilaog的。

 

以下是今天自己总结的一点(仅在MFC上试验的):

任何Window当单击标题栏上的X按钮时都会发生WM_CLOSE消息,从MSDN可以查到这个消息的默认实现是调用DestroyWindow,但是对于Modeless对话框貌似不是这样的,你必须自己调用DestroyWindow不知道这是不是就是MSDN说的Modeless必须自己调用DestroyWindow;

 

 

Model对话框的流程是这样的:

WM_CLOSE->OnCancel->OnDestroy其中多走了一道OnCancel,貌似Model对话框的WM_CLOSE也不直接调用DestroyWindow,而是在EndDialog间接调用。

 

总结:对于Modeless在WM_CLOSE中自己调用DestroyWindow,否则会出问题的,而且尽量不要在里面有IDOK,IDCANCEL的按钮,即使有也要重载并调用DestroyWindow。

 

以后有时间再把这个问题在SDK上跑一遍,MFC也真够烦的。

Flicker free drawing of any control

发表于 2009-02-22 | 分类于 VC

 

There are two articles dealing with this subject on this site, but i guess sometimes it’s needed to free one single control from flickering, and it’s not needed to use a complete new window-class. I will show you a really small solution of the flickering-problem, which uses the CMemDC-class from the article by Keith Rule. To make a control flicker free you have to go three steps, as described now.

#### 1. Override the OnEraseBkgnd()-routine of the control

Flickering apears, because the complete control is erased and it needs some time to fill the control-area with some text/graphics or whatever. There is a really short moment, when nothing can bee seen, because the background was erased but nothing is written yet. That’s why we don’t erase the background of the control anymore. to do this, we have to override the OnEraseBkgnd()-routine of the control like this:

   BOOL CRecordList::OnEraseBkgnd(CDC* pDC)
{
return FALSE;
}


#### 2. Override the OnPaint()-routine of the control

 

The second thing to do, is to override the OnPaint()-routine. The trick is, to paint the complete control into a memory device-context and copy it in the original DC via BitBlt(). The CMemDC-class does this work for you. Because we don’t erase the background anymore (see above), we need to erase the memory-device-context with the background-color of the control. A typical OnPaint() should look like this:

 

   void CRecordList::OnPaint()
{
CPaintDC dc(this);
CMemDC memDC(&dc);

CRect clip;
memDC.GetClipBox(&clip);
memDC.FillSolidRect(clip, GetSysColor(COLOR_WINDOW));

DefWindowProc(WM_PAINT, (WPARAM)memDC->m_hDC, (LPARAM)0);
}


#### 3. Override the EraseBkgnd()-routine of the control’s parent

Imagine the following situation. You have a dialog with the flicker free control in it. And now the user resizes the window. What happens? First of all, the background of the dialog is erased and after that all controls of the window are redrawn. But when the background is erased and THAN the controls are redrawn, we still have flickering! That why we have to exclude the controls area out of the clipping-box of the control’s parent. And here’s how we do it:

   BOOL CListBar::OnEraseBkgnd(CDC *pDC)
   {
      CRect clip;
      m_Control->GetWindowRect(&clip);// get rect of the control

      ScreenToClient(&clip);
      pDC->ExcludeClipRect(&clip);

      pDC->GetClipBox(&clip);
      pDC->FillSolidRect(clip, GetSysColor(COLOR_BTNFACE));

      return FALSE;
   }

That's it. You can make near every control flicker free in this way, but for some of the controls, you have to change the routines above slightly. Like for the ListCtrl in Report-mode, because the columne-header-area have to be excluded of the clip-box, like this: 
   void CRecordList::OnPaint()
   {
      CPaintDC dc(this);

      CRect headerRect;
      GetDlgItem(0)->GetWindowRect(&headerRect);
      ScreenToClient(&headerRect);
      dc.ExcludeClipRect(&headerRect);

      CMemDC memDC(&dc);
      .
      .
      .
   }

 

 


买本必看,防商家忽悠秘籍.

发表于 2009-01-28 | 分类于 生活轨迹

由于要买本了转篇提醒自己不要上当了!

买本必看,防商家忽悠秘籍.(希望能帮到大家我可是写了半个小时哦)希望大家能耐性的看完我的文章.

我现在从事笔记本电脑销售业务,以前在读大一的时候卖过本子.呵呵,那就结合自己的实际情况,写一篇对各位朋友友在购买笔记本电脑时有帮助的贴子吧.而目前这个市场也确实不规范,那么,就让我们擦亮眼睛,来看看怎么样防止电脑城形形色色的JS吧.先声明一下,电脑城绝大多数都是讲诚信的销售,包括我自己哦,但是,还是有一部分,为了赚钱确实是不择手段了,那么,让我们一起来看一下有哪些招数吧

第一:最重要的一点:不要轻易改变自己已经看好的笔记本电脑型号和配置!原因很简章,当你看中这一款了,你之前对这款的配置和价格都问了很多家经销商了.因为笔记本市场竞争激烈,基本上你问的价格对经销商来说,就没利润了.那怎么办呢?很简单,给你改型号,试想一下,你跑了一天了,那个型号也问的差不多了,而经销商通过各种技巧让你买另一款机子,看看天色也晚了,自己也跑累了,不想出去跑了,看着销售员"善良"的眼神,想想这个款也差不多,算了,不出去问了,就买吧,呵呵,那你就中招了.因为你对这款价格不了解,可以想像,经过这种转型而来产生的利润,绝对是暴力了,用我们行话来说,至少有1毛(1毛=1000元).如果你确实喜欢上了销售员推荐的新款,那么对付这招也很简单,不管销售员怎么向你保证价格是最低了.一定要拉下面子出去再问问价格,问了你就知道,你这样做是绝对有价值的.呵呵.很多厉害的销售员就吃准了客户不好意思的心理,让你不好意思走出他的店,那么,你自己也成为被宰的对象了.如果你出去问了,发现之前那个给你改型号的销售员价格比较合理,那么恭喜你,你遇到了非常少见讲诚信的销售员,还等什么呢?就在这买吧.

第二:问价格有也有讲究,如果你一开始就问一款机子大概的型号,比如,华硕的A8,你只说了A8两个字,那么,你问到的价格,多半是非常高的.因为这种情况下销售员肯定要报高价的,如果你说价格太高,他们也会说有很多种型号呢,配置多呢,我报的是XX配置,那你就没话说了.正确的问价方式是:报出精准的型号,如:A8H73SC-SL当你这样一问,做为销售员,就知道你是了解的非常清楚了,不然不会报出这么准确的型号,那么,他们也不敢胡乱报价了.这样你问到的价格就是非常实际的.而不是毫无意义的乱报的价格.

第三:不要为突然问到一个非常超低的让你感到脸发热心乱跳的超低价而激动不已,呵呵,事实上,很多销售员是这么干的,你要买这款机子是吧?了解一下价格,哦,我没钱赚,怎么办呢?转型啊,怎么转呢?第一步就是先给你报个超超低价,你一听,开心啊,激动啊,这么低的价格,不禁对这位销售员好感倍增.那么,你看好了,他第二步,肯定会说以前你看中的那个机子怎么怎么不适合你,我现在这款怎么怎么合适你.呵呵,记住哦,如果真的看中他新推荐的这一款,一定要出去多问几家,如果你不改变主意了,就不要浪费你时间了,让他拿货吧,多半是拿不出来的,因为他报的价格是低于成本报的,压根就没打算卖给你,结果浪费了你宝贵的时间,所以,我的忠告是:不要在报价最低的那一家买.你多半只会收获失望.

第四:对自己看好的配置一定要了解清楚.如果不懂,就找个懂的(怕就怕不懂装懂的人来做参谋,这样的人最容易被销售员三下两下就摆平了,一定要找确实很懂的人陪你)因为销售员很会利用你不懂配置来忽悠你,明明就是一样的机子,硬说多了一个什么独立显卡啊,或者是什么炫丽屏啊之类的,让你加钱购买.这样的客户在我眼里是很可悲的.我曾经亲眼见过笔记本电脑所带的电池居然也被销售员单独加价两千卖掉了,不懂电脑的用户毕竟多啊.如果你清楚配置,销售员这一招自然也没用了.

第五:当然还是要了解你要购买的机子的赠品,比如,华硕有段时间,S5笔记本电脑高配版是免费送第二块电池的,当然了,如果你不知道这个信息,销售员肯定会让你加个三五百的买第二块电池,没说的.其实像这样的促销,最简单的一点,厂家做这类促销的时候,肯定会有相关的彩页出来做宣传,你在了解电脑的阶段时只要记的向销售员索取一份彩页,基本上就不会中这一招了.当然了,在家里上一些非常大的网站了解一下,就更好了.

第六:很多淘友在买笔记本电脑的时候,非常喜欢要一些赠品,我告诉大家,销售员在送赠品的时候,只一个原则:最便宜.所以送的基本上全是垃圾.所以,最聪明的销售者,会先要东西,然后再跟销售员,这些东西我不要了,你给我减钱,呵呵,不要指望能减掉销售员跟你说这个值多少钱,那个值多少钱的程度,基本上,他说值100元的东西,成本在30元就不错了.能减多少,就看你是怎么跟销售员谈啦.

第七:很不幸,厂家没有给经销商发样机来出样,所以,你们在电脑城看到的样机,全是要当新机卖掉的.当然了,样机也不会像一般人想象的那样,非常烂的机器,事实上,我们在为如何保护样机,可是非常用了心的.说难听点真是轻拿轻放,因为万一因为你造成样机划伤,你是要赔两百元来喷漆的.如果你真的不想要样机,不要看包装,没用的,有些大的商家连那个封条都自己去印了.那看什么呢?两点:第一:看接口处如网卡部分,有没有进灰尘,新机子是不会有灰的.其次,仔细看键盘里有无灰尘,表面有无划伤,特别是kinston锁孔,基本上因为考虑到防盗,这里都要锁上的,就难免有点划伤.如果这里有划伤,就可以确定是样机了.

第八:很多销售员说要开发票就要加钱,加几个几个税点,这就纯粹是欺骗了,因为笔记本电脑进货的时候就是含税的,不可能是要另加钱的.另外,很多销售员会说保修不用发票,只要收据就可以了.以此为借口不给你开发票只开收据.确实,保修的话,没发票也能保修.但请注意,还是有区别的.如果没有发票,保修日期是按出厂日期来计算的,有发票,则是按发票日期来计算保修日期的.而笔记本电脑库存两个月非常正常,所以想像一下,如果你不幸在那两个月的时候,机器坏了...还有一点;国家有一个法律叫<微型计算机三包政策>,哪三包呢?出现质量问题,七天包退,十五天包换,一年内,经两次维修仍不能正常使用的,包换.所谓三包.而如果你要享受这三包,那前提是,你得有发票.那为什么销售员不给你开发票呢?很简章,无利不起早,他可以把本属于你的发票卖给别人来获取利益.所以,购买整机的时候,一定要记的索取发票!

第九:可能说出来让很多人觉得人很难相信了,呵呵,但我告诉大家,以前我们那个店面,15%的利润,都是拿回扣的人帮我们创造的.所以,如果你请熟人帮你把关电脑,记住一个原则即可:拉下面子,自己要独立的出去问问价格.这样,你就不会被人忽悠了.所以我就不大愿意帮熟人买电脑,因为我知道这一点,我不想背上这个骂名啊,我的方法是:你先自己出去问价格,然后我再帮你问,这样,你价格心中有底,就不会怕我拿回扣啦,呵呵.呵呵,希望经常帮朋友装机的熊友表打我哦.毕竟热心的朋友还是占多数的.

好了,写了有半个多小时了.暂时写这么多,其实还有很多陷阱,那就下次再写吧.如果有朋友友因为电脑硬件技术不明白的,可以随时问我.最好晚上,我时间比较多,毕竟白天我也要工作养家哦.呵呵,最后告诉大家,如果你看了我的贴还被骗了我就无语了.呵呵,另外,觉得是好贴的别忘了帮我顶一下哦,希望可以让更多的朋友得到帮助.
http://itbbs.pconline.com.cn/notebook/8751105.html

如何防止任务栏上出现一个窗口

发表于 2009-01-28 | 分类于 VC

有时,可能需要为应用程序可以防止其主窗口出现在任务栏上。 本文介绍了可以完成这两种方法。

 

有两种方法,若要防止一个窗口显示外壳的任务栏上和按 Alt+Tab 时出现的任务列表窗口中。

  • 提供扩展的 WS_EX_TOOLWINDOW 样式窗口,并删除 WS_EX_APPWINDOW 样式。 一个的副作用窗口会较小比正常的窗口标题。* 为 WS_POPUP 样式窗口,并使拥有隐藏的窗口的其。

如果一个窗口是创建或显示,因此其显示在任务栏中,然后在窗口应为相同的状态损坏或隐藏时。 如果在任务栏上的可见性不同步,然后任务栏可能最终与它认为应仍然显示该窗口的空白按钮。

 

原文:http://support.microsoft.com/kb/205158/

QQ2008搜索框模拟

发表于 2009-01-27 | 分类于 VC

断断续续搞了几天了,纯粹是为了练习WTL和一些基本的贴图等技术,当然也涉及一些控件的细节处理。

模拟原图输入后显示两个按钮

上面的是我的模拟图,下面的是QQ的。

QQ原图QQ输入图

 

 

主要实现技术:

1.主界面显然是贴图

2.通过spy可以发现QQ搜索框

 Spy截图

一共是有八个子窗体,但是由于技术有限那个AfxWnd42不知道是干什么的,它的大小貌似一直都是0,所以我的模拟程序中也只有7个子窗体。

3.按钮是自己写的一个三态位图按钮http://blog.csdn.net/ToCpp/archive/2009/01/22/3849541.aspx

4.编辑框也是模拟QQ那个的写的,当然我没有用RichEdit,主要是以前没用过这个,那天第一次用时由于没有加载相应的dll,导致始终不出来,后来干脆不用反正也是想练练手。

5.窗体的拉伸是通过HITTEST,第一次发现这个消息很强大

Edit控件改变背景色

发表于 2009-01-27 | 分类于 VC

WM_CTLCOLOREDIT比WM_ERASEBKGND更方便,光响应WM_ERASEBKGND貌似不起作用!

 

To change the background color of a single-line edit control, set the brush handle in both the CTLCOLOR_EDIT and CTLCOLOR_MSGBOX message codes, and call the CDC::SetBkColor function in response to the CTLCOLOR_EDIT code.

三态位图按钮

发表于 2009-01-22 | 分类于 VC

下午无聊写的一个简单三态按钮,功能很有限,对于一般的不需要拉伸的对话框还比较适用(不能指定WS_CLIPCHILDREN风格):

class CBitmapButton : public CWindowImpl<CBitmapButton,CButton>,
  public COwnerDraw<CBitmapButton>
{
private:
bool m_bTracking;
bool m_bDCStored;
CBitmap m_bitmapNor;
CBitmap m_bitmapOver;
CBitmap m_bitmapDown;
public:
CBitmapButton():m_bTracking(false),m_bDCStored(false)
{

}
virtual ~CBitmapButton()
{

}
void SetImage(CString strNormal, CString strHover, CString strDown)
{
m_bitmapNor=(HBITMAP)::LoadImage(NULL,strNormal,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
m_bitmapOver=(HBITMAP)::LoadImage(NULL,strHover,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
m_bitmapDown=(HBITMAP)::LoadImage(NULL,strDown,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
}

void SetImage(UINT nNormalID, UINT nHoverID, UINT nDownID)
{
m_bitmapNor.LoadBitmap(nNormalID);
m_bitmapOver.LoadBitmap(nHoverID);
m_bitmapDown.LoadBitmap(nDownID);
}

BEGIN_MSG_MAP(CBitmapButton)
MESSAGE_HANDLER(WM_CREATE,OnCreate)
MESSAGE_HANDLER(WM_ERASEBKGND,OnEraseBkgnd)
MESSAGE_HANDLER(WM_MOUSEMOVE,OnMouseMove)
MESSAGE_HANDLER(WM_MOUSELEAVE,OnMouseLeave)
CHAIN_MSG_MAP_ALT(COwnerDraw<CBitmapButton>,1)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()

LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
Init();
bHandled = FALSE;
return 1;
}

LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
return 1;
}

LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
bHandled=FALSE;

if (!m_bTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof (tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE;
tme.dwHoverTime = 1;
m_bTracking = _TrackMouseEvent(&tme);
Invalidate(FALSE);
}

return 0;
}

LRESULT OnMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
bHandled=false;

m_bTracking = false;
Invalidate(FALSE);

return 0;
}

void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
CDCHandle dc = lpDrawItemStruct->hDC;

CRect rcBtn( lpDrawItemStruct->rcItem);

BITMAP bmpInfo;
m_bitmapNor.GetBitmap(&bmpInfo);

if (m_bTracking)
{
CDC dctemp;
dctemp.CreateCompatibleDC(dc);
dctemp.SelectBitmap(m_bitmapOver);

::TransparentBlt(dc,0,0, lpDrawItemStruct->rcItem.right, lpDrawItemStruct->rcItem.bottom, dctemp.m_hDC, 0,0, bmpInfo.bmWidth, bmpInfo.bmHeight, RGB(255,0,255));
}

if (lpDrawItemStruct->itemState & ODS_SELECTED)
{
CDC dctemp;
dctemp.CreateCompatibleDC(dc);
dctemp.SelectBitmap(m_bitmapDown);
::TransparentBlt(dc,0,0, lpDrawItemStruct->rcItem.right, lpDrawItemStruct->rcItem.bottom, dctemp.m_hDC, 0,0, bmpInfo.bmWidth, bmpInfo.bmHeight, RGB(255,0,255));
}
else if (!m_bTracking)
{
CDC dctemp;
dctemp.CreateCompatibleDC(dc);
dctemp.SelectBitmap(m_bitmapNor);
::TransparentBlt(dc,0,0, lpDrawItemStruct->rcItem.right, lpDrawItemStruct->rcItem.bottom, dctemp.m_hDC, 0,0, bmpInfo.bmWidth, bmpInfo.bmHeight, RGB(255,0,255));

}

int cchLen=GetWindowTextLength()+1;
if (cchLen>1)
{
CFont oldFont=dc.SelectFont(GetFont());
LPTSTR strText=NULL;

strText=new TCHAR[cchLen];
::memset(strText,0,cchLen);
GetWindowText(strText,cchLen);
CRect rtText;
GetClientRect(&rtText);
dc.SetBkMode(TRANSPARENT);
dc.DrawText(strText,cchLen-1,&rtText, DT_CENTER|DT_SINGLELINE |DT_VCENTER);

delete strText;
dc.SelectFont(oldFont);
}

}
protected:
void Init()
{
ModifyStyle(0,BS_OWNERDRAW);
}
};

 

Demo

 

 

可怜的电脑

发表于 2009-01-21 | 分类于 生活轨迹

     从回家那会打开电脑一直到昨天电脑就一直饱受”伤病”,刚开始是光驱坏了,打不开,我就拿个针猛挫那个据说可以使其开的小孔,事实证明我那天那个针有点大(后来帮我姑姑弄她那光驱时是弄出来的),第三天鼠标就突然坏了,和以前的症状一样,突然就不动了。等我顺便去买了个键鼠套装回来后,发现键盘有些键不灵,接着就是开机就死机,以前从来没有碰到过这种情况,搞得人很郁闷,很担心是主板坏了,幸好这次的担心时多余的,换了个风扇OK了,接下来的几天还算顺利,当我把送去修的光驱拿回来之后噩梦就开始了,不知道时什么原因接上光驱后电脑自检过不了,但是是可以接通电源的,我以为是又碰到内存了,以后都是这样的症状,于是把内存拔下来,怕内存没插紧又不过自检,插了两次都觉得不太紧,第三次猛的一插,风扇看着转了几圈,听弟弟说音响好像也响了下,接着就是不通电了……,心里马上就知道结果肯定不太妙了,马上拿到附近一家新开的电脑店(TMD那人表面上看到很好,其实……),结果他说是桥坏了,还说自己不太确定要第二天给仔细确认下,叫我不要太早去找他了,哪知道他是想自己拿到电脑城去弄,等他给我打电话时TMD人都在电脑城了我马上说我也去电脑城,结果TMD说来不及了还有什么人等着他拿东西,我那时还没起来我说让他等我下我马上就赶过去,起来穿着鞋就走了,赶到火车站转车时还给他打电话说让等我下一个小时就到了,TMD也说好,等我赶到电脑城后给他打电话先是不接,后来TMD说等我好久了别人等着他拿货就走了,Fuck把我板子也带走了,我真TMD服了,再打电话就直接不接。白坐了两个多小时的车跑到电脑城,回来后去问他他TMD真他妈的会装,还说为那个买新的肯定买不到,说我的确是桥坏了我去的时候还把我的电源和光驱再试他自己的破机子,真是不好说了,昨天本来是想直接发火的,不知道是怎么搞的最后还是忍住了。说让我实在买不到他顺便带回了个新的,让我给他打个电话给我用着。真他妈Fuck,后来我让他把我的东西都装好,拿走!

昨天早上一大早和弟弟,直接把我的主机带到了电脑城我配电脑那家,他们说主板坏了其实我也打算就买个新的就算了,但是看着那主板再想着这些天电脑的一系列问题心里真是不爽,毕竟我一直都觉得这主板挺好的,我那是915的板子,换945(现在估计是卖的最低端的了吧)内存肯定不兼容了,又得换内存,和那人磨了半天搭上一个我的DDR1的512,450成交,现在内存是DDR2,2G,主板是ABIT,I-45C,小板,还带个集成显卡,质量肯定没我那个技嘉915的好,虽然它是945的,装完主板后差点还害得我又买了显卡,那人说我显卡坏了,显示器不亮,后来把我显卡拔了插那集成的,亮了,我还以为是真的坏了,都和另一装机工讨论现在最次的显卡价格及参数(现在几年不看那些硬件了,显存512都是最差的……),那人我很郁闷又把显卡金手指擦了下,亮了,这是今天唯一高兴的一刻,顺便在它那跑了下3dMark差不多可以过了,回来自己再试下,还行比我主板坏之前还高点,我估计是内存的原因,现在真是担心硬件坏了,而且不敢不拔电源弄硬件了,要不又要倒霉了。

PS:事事都小心是最好的!!

SetViewportOrgEx---GDI学习

发表于 2009-01-09 | 分类于 VC

The SetViewportOrgEx function specifies which device point maps to the window origin (0,0).

总是对这个系列的函数不太清楚,ViewPort(Device Point),WindowPort(Logic Point),这个函数将参数中指定的x,y(设备坐标),映射到Window Origin(0,0),也就是你实用GDI时其坐标原点现在在(x,y)而不是UpLeft。

**BOOL SetViewportOrgEx(
  HDC**_ hdc_**,        **// handle to device context
**  int**_ X_**,          **// new x-coordinate of viewport origin
**  int**_ Y_**,          **// new y-coordinate of viewport origin
**  LPPOINT**_ lpPoint_ // original viewport origin
**);**

Parameters

hdc
[in] Handle to the device context.
_X_
[in] Specifies the x-coordinate, in device units, of the new viewport origin.
_Y_
[in] Specifies the y-coordinate, in device units, of the new viewport origin.
lpPoint
[out] Pointer to a POINT structure that receives the previous viewport origin, in device coordinates. If lpPoint is NULL, this parameter is not used.

This function (along with SetViewportExtEx and SetWindowExtEx) helps define the mapping from the logical coordinate space (also known as a window) to the device coordinate space (the viewport).

这个函数与SetViewportExtEx and SetWindowExtEx一起使用使得逻辑坐标映射到相应的设备坐标SetViewportOrgEx specifies which device point maps to the logical point (0,0). It has the effect of shifting the axes so that the logical point (0,0) no longer refers to the upper-left corner.

//map the logical point (0,0) to the device point (xViewOrg, yViewOrg)
SetViewportOrgEx ( hdc, xViewOrg, yViewOrg, NULL)

This is related to the SetWindowOrgEx function. Generally, you will use one function or the other, but not both. Regardless of your use of SetWindowOrgEx and SetViewportOrgEx, the device point (0,0) is always the upper-left corner

SetWindowOrgEx可以达到同样的作用,但是通常情况下只应该使用其中的一个(记住),注意:不管是使用SetWindowOrgEx还是SetViewportOrgEx,设备点(0,0)始终是在左上角的。

 

为了以后不在这里纠缠不清,以后都只用这个函数了,现在GDI中的(0,0)现在是(x,y)了。

1…111213…16

billowqiu

157 日志
33 分类
10 标签
GitHub E-Mail
© 2020 billowqiu
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.3