1.Windows ä¸ä¸è§åçªä½çç¼ç¨å®ç°
2.å
³äºGetTextMetricsï¼&tmï¼
3.å¦ä½å¨vcï¼ï¼ä¸ç¨cdcç»å¾
4.Flink mysql-cdc connector 源码解析
5.CDIB什么意思
6.c++å¨pictureboxä¸ç»å¾
Windows ä¸ä¸è§åçªä½çç¼ç¨å®ç°
ããWindows ä¸ä¸è§åçªä½çç¼ç¨å®ç° ä¸è½½æºä»£ç ä¸ åºè¨ ããå¨ç»å¤§å¤æ°çWindowsåºç¨ç¨åºä¸ å ¶çªä½é½æ¯ä½¿ç¨çæ£è§æ£ç©çç©å½¢çªä½ ä¾å¦æ们常ç¨ç è®°äºæ¬ æ«é· çç ç©å½¢çªä½ å ·æç¼ç¨å®ç°ç®å é£æ ¼ç®æ´çä¼ç¹ æ以å¨æ®éææ¡£åºç¨ç¨åºåç®åå°æ¸¸æä¸ä½¿ç¨è¶³ç£ ä½å¨æäºå¨±ä¹æ¸¸æç¨åºä¸ä½¿ç¨å°±ç¥æ¾åæ¿äºäº è¿æ¶è¥ç¨ä¸è§åçªä½æ¿ä»£åå çç©å½¢çªä½ å°ä¼ä½¿è¿ç±»ç¨åºæ´æ·»æ 趣 å ¸åçä¾åæwindows èªä»£çMedia Player æ°çæ¬çMedia Playeræ个æ§å¶é¢æ¿çé项 éä¸è¿äºé¢æ¿ ææ¾å¨å°±ä»¥éä¸çé¢æ¿å½¢ç¶åºç° è¿æ¶çææ¾å¨æ¯ä»¥åçæ¬çMedia Playerçå¤èç©å½¢çé¢è¦çå¨æ趣çå¤äº è¦å®ç°ä¸è§åçªä½ä¸æ¯å¤ªé¾ ç¥éäºåºæ¬åçå ä½ ä¹å¯ä»¥å建åç§æ趣çä¸è§åçªä½ äº å®ç°åç ããææç Windows çªä½é½ä½äºä¸ä¸ªç§°ä¸º region ä¸ çªä½ç大å°å¦æè¶ åº region çèå´ windowsä¼èªå¨è£åªè¶ åº"region"èå´é£é¨åççªä½ ä½¿å ¶ä¸å¯è§ æ以 è¦å建ä¸è§åçªä½æ两个æ¥éª¤ 第ä¸æ¥å°±æ¯å建ä¸è§å"region" 第äºæ¥å°±æ¯å°çªä½æ¾å°å建ç region ä¸ ããå ¶ä¸ç¬¬äºæ¥å¾ç®åå°±è°ç¨ä¸æ¡è¯å¥å³å¯ å¨SDKä¸è°ç¨APIå½æ°SetWindowRgn 该å½æ°ååå¦ä¸ããint SetWindowRgn( HWND hWnd HRGN hRgn BOOL bRedraw );
ããå ¶ä¸hWndä¸ºå¾ è®¾ç½®ççªä½å¥æ hRgn为已ç»å建ç"region"å¥æ bRedraw代表æ¯å¦è¦éç»çªä½ å¨MFCä¸ä½¿ç¨çªå£ç±»CWndçæåå½æ°int CWnd::SetWindowRgnï¼HRGN hRgn BOOL bRedraw );该å½æ°çåæ°æä¹ä¸APIä¸ååå½æ°ç¸å ããç¸å¯¹ä¸ç¬¬äºæ¥ å建ä¸è§åçªä½ç第ä¸æ¥è¦å¤æè®¸å¤ å¹¶ä¸ä¸è§åçªä½è¶å¤æ åå»ºå ¶"region"çè¿ç¨ä¹è¶å¤æ æ¥ä¸å»æ们å°ç±æµ å ¥æ·±å°ä»ç»åç§å建 region çæ¹æ³ ããå¨MFCä¸"region"对象 ç±CRgnç±»å®ç° CRgnçå ä¹æ¯ä¸ªæåå½æ°é½æååçSDK APIå½æ°å¯¹åº ä¸ ç®å region çå建 ããç±»CRgnå建ä¸ä¸ªæ°ç"region"çç®åæ¹æ³æ以ä¸å 个æåå½æ°
BOOL CRgn::CreateRectRgn( int x int y int x int y ); å建ç©å½¢ç region
BOOL CRgn::CreateEllipticRgn( int x int y int x int y ); å建åå½¢ææ¤åå½¢ region
BOOL CRgn::CreateRoundRectRgn( int x int y int x int y int x int y ); å建åè§ç©å½¢ region
BOOL CRgn::CreatePolygonRgn( LPPOINT lpPoints int nCount int nMode ); å建å¤è¾¹å½¢ region
ããè¿é以å建æ¤åçªä½ä¸ºä¾ ä»ç»æ¤åçªä½å建çæ¹æ³ å¨å建æ¤å region çCreateEllipticRgnå½æ°ä¸ x y ææ¤åæå¨ç©å½¢çå·¦ä¸è§åæ x y æ该ç©å½¢çå³ä¸è§åæ ããä¸é¢ç代ç å å ¥å°MFC对è¯æ¡ç¨åºçOnInitDialogå½æ°ä¸ å¯å°è¯¥å¯¹è¯æ¡åææ¤åçªä½
ããBOOL CTestDlg::OnInitDialog(){ CDialog::OnInitDialog(); CRgn rgn; rgn CreateEllipticRgn( ); SetWindowRgn(rgn TRUE);}
å¾ä¸ æ¤åçªä½ææå¾ å ä½å¾è·¯å¾æ³å建 region 使ç¨è¯¥æ¹æ³å建 region çè¿ç¨å¦ä¸ 第ä¸æ¥ç»å¶æè¦å建ççªä½å½¢ç¶ 该æ¥éª¤ä¸ä½¿ç¨å°CDCç±»ä¸çä¸äºæåå½æ°å¦ä¸ããBOOL CDC::BeginPath( );
ããè°ç¨è¯¥å½æ°åå½å设å¤ç¯å¢(DC)å¼å§è¿½è¸ªç»å¾çè¿ç¨
ããint CDC::SetBkMode( int nBkMode );
ãã设置ç»å¾æ¶çèæ¯æ¨¡å¼ æ¤åºç¨ä¸nBkModeå¿ é¡»åå¼ä¸ºTRANSPARENT å³è®¾ç½®ç»å¾æ¶èæ¯ä¸åçåå
ããBOOL CDC::EndPath( );
ããè°ç¨è¯¥å½æ°åå½å设å¤ç¯å¢(DC)ç»æ追踪ç»å¾çè¿ç¨ ããå¼å§ç»å¾å å è°ç¨BeginPath ç¶åè°ç¨SetBkMode æ¥ä¸å»å°±å¯è°ç¨CDCçå ¶ä»ç»å¾å½æ°ä½å¾ ä¾å¦Arc AngleArc LineTo MoveTo RoundRect Textoutçç ç»å¾å®æ¯è°ç¨EndPath() 第äºæ¥å°ç»å¶çç»æ转æ region æ¤æ¥éª¤ä¸ä½¿ç¨SDK APIå½æ°
ããHRGN PathToRegion( HDC hdc );
ããHdc为ä½å¾DCçå¥æ CDCç±»ä¸çm_hDCæååéå¯åæ¤åæ°ä¼ å ¥ ç¤ºä¾ å°ä¸é¢ä»£ç å å ¥æ个æé®åå»äºä»¶ä¸ å¯ä»¥å°å½åçªä½å为å符串 hello çå½¢ç¶
ããvoid CTestDlg::OnTest() { HRGN wndRgn; CClientDC dc(this); CFont mFont; if (dc m_hDC!=NULL) { VERIFY(mFont CreateFont( FW_HEAVY TRUE FALSE ANS
lishixinzhi/Article/program/c//å ³äºGetTextMetricsï¼&tmï¼
DCæ¯è®¾å¤ä¸ä¸æï¼å®ä¹äºç»å¾çå±æ§åå·¥å ·ã
CDCæ¯MFCå°è£ çä¸ä¸ªç±»ï¼ç¨äºæä½DCã
pDCï¼è¿éåºè¯¥æ¯æåCDC类对象çæéã
CDC::æ¯ä¸ªä½ç¨åç说æï¼ç±»ä¼¼std::cout
å¦æä½ ç¥éç±»ã对象ãæéçæ¦å¿µï¼è¿åºè¯¥æ²¡é®é¢ã
å¦ä½å¨vcï¼ï¼ä¸ç¨cdcç»å¾
ä¸ãVCæ¯ä»ä¹ï¼å¦VCæ¯å¦ä»ä¹ï¼
é¦å VCæ¯ä¸ä¸ªè½¯ä»¶ï¼IDEéæå¼åç¯å¢ï¼ï¼ç¼è¯ãç¼è¾ãè°è¯ï¼
CåC++ãä½C++ä¸çæäºç¹æ§æ¯ä¸ç¨çï¼ä¾å¦I/Oæµï¼å¤æ继æ¿
WindowsSDKï¼è½¯ä»¶å¼åå·¥å ·ï¼
VCççµéï¼MFCï¼å¾®è½¯åºç¡ç±»åºï¼
ATLï¼ActiveX模æ¿ç±»åºï¼
å ¶ä»çSDKï¼å¦OpenGL,源码p源DirectX,ActiveMoive,DrawDib(WinG)
VCæ¯è®¸è®¸å¤å¤ææ¯ç综åï¼å°±å¥½è±¡å°æè¬ç»æï¼ä¸è¬å¨åºç¨ä¸å¦ä¼å ¶ä¸å¾å°ä¸é¨åå°±å¤äºãæ们çç°å¨ç®çï¼å ¶å®ä¸è¿æ¯å¦ä¸å¥å°æé¿æ³ãè¿å¥é¿æ³åºå æ¬ï¼
1ãå »æä¸ç§ä¸¥è°¨ç软件å¼åä¹ æ¯ï¼çæ软件工ç¨çåºæ¬ååã
2ãCè¯è¨åºç¡
3ãC++æåºæ¬å 容ï¼ç±»ã继æ¿æ§ãå°è£ æ§ãå¤ææ§çæ¦å¿µ
4ãå¦ä½ç¨å导建ç«ä¸ä¸ªç¨åºæ¡æ¶
5ã设计èå
6ãè®¾è®¡å·¥å ·æ¡
7ã设计å使ç¨å¯¹è¯æ¡ï¼çææ常ç¨ç对è¯æ¡æ§ä»¶ï¼æé®ãéæææ¬ãç¼è¾æ¡ç
8ãç¥éææ ·æ°å»ºç±»ãæåå½æ°ãæååéãæ¶æ¯å¤çå½æ°ã
9ãäºè§£æ常ç¨çWindowsæ¶æ¯ï¼å¦WM_PAINT(éç»çªå£)ï¼é¼ æ æä¸ã弹起ã移å¨ï¼åå§å对è¯æ¡ï¼çã
ãäºè§£æç®åçGDI(å¾å½¢è®¾å¤æ¥å£)ï¼åæåãç»æ¡ãç»ç¹ãç»çº¿ãç»åï¼è®¾ç½®ç»ç¬ãç»å·ã
ãçææ常ç¨çMFCç±»ï¼
CWnd
CDocument
CView
CDC
CDialog
CWinApp
CGdiObjectååç±»
CStringãCPointãCRectãCSizeçç®åæ°æ®ç±»å
CFile
以ä¸æå°çè¿äºå 容ï¼æ¯æ¯ä¸ªäººé½ä¼ç¨å°çå 容ã
äºãMFCç®ä»
ä¸è¿°ä¸»è¦å 容é½æ¯ä¸å®é æä½å ³ç³»é常å¯åçï¼å¨æ¤ä¸å¯è½è®²æ¸ æ¥ï¼èä¸ï¼è¿äºå¨ä¸è¬ç书éé½ä¼è®²å°ãæ主è¦å°æéè¦çMFCä»ç»ä¸ä¸ã
MFCæ¯å¯¹WindowsAPIçå°è£ ï¼å¤§å¤§ç®åäºæ们çå·¥ä½ï¼å¦VC主è¦å°±æ¯è¦å¦MFCï¼å¤§çº¦æå¤ä¸ªç±»ï¼ä½å¸¸ç¨çä¹å°±äºä¸å个ãåºè¯¥è±¡è4级åè¯ä¸æ ·å°è¿äºå¸¸ç¨ç±»ææï¼å½ç¶ä¸è¦æ»è®°ï¼è¦éè¿ç帮å©ãçä¾åãå¨æç»ä¹ æ¥å¦ä¼å®ä»¬ï¼èä¸ï¼å¹¶éæ¯ä¸ªç±»çå é¨çææå½æ°é½è¦å¦ä¼ï¼è¦æ¥ç§¯æç´¯ãå¦æççæ³æ为é«æï¼å个ç¬è®°æ¬æèªå·±è®¤ä¸ºéè¦çç±»ãå½æ°è®°ä¸æ¥ï¼éæ¶å¦ä¹ ï¼ä¹æ¯å¾å¥½ççªå»æ¹æ³ã
ä¸é¢ä»ç»æéè¦çMFCã
CWndï¼çªå£ï¼å®æ¯å¤§å¤æ°âçå¾è§çä¸è¥¿âçç¶ç±»ï¼Windowséå ä¹ææçå¾è§çä¸è¥¿é½æ¯ä¸ä¸ªçªå£ï¼å¤§çªå£éæ许å¤å°çªå£ï¼ï¼æ¯å¦è§å¾CViewãæ¡æ¶çªå£CFrameWndãå·¥å ·æ¡CToolBarã对è¯æ¡CDialogãæé®CButtonï¼etc;ä¸ä¸ªä¾å¤æ¯èåï¼CMenuï¼ä¸æ¯ä»çªå£æ´¾ççã该类å¾å¤§ï¼ä¸å¼å§ä¹ä¸å¿ å¦ï¼ç¥éå°±è¡äºã
CDocumentææ¡£ï¼è´è´£å åæ°æ®ä¸ç£çç交äºãæéè¦çæ¯OnOpenDocument(è¯»å ¥),OnSaveDocumentï¼åçï¼,Serializeï¼è¯»åï¼
CViewè§å¾ï¼è´è´£å åæ°æ®ä¸ç¨æ·ç交äºãå æ¬æ°æ®çæ¾ç¤ºãç¨æ·æä½çååºï¼å¦èåçéåãé¼ æ çååºï¼ãæéè¦çæ¯OnDraw(éç»çªå£)ï¼é常ç¨CWnd::Invalidate()æ¥å¯å¨å®ãå¦å¤ï¼å®éè¿æ¶æ¯æ å°è¡¨å¤çèåãå·¥å ·æ¡ãå¿«æ·é®åå ¶ä»ç¨æ·æ¶æ¯ãä½ èªå·±ç许å¤åè½é½è¦å å¨éé¢ï¼ä½ æ交éæå¤çå°±æ¯å®ã
CDC设å¤ææ¬ãæ 论æ¯æ¾ç¤ºå¨è¿æ¯æå°æºï¼é½æ¯ç»å¾ç»ç¨æ·çãè¿å¾å°±æ½è±¡ä¸ºCDCãCDCä¸å ¶ä»GDIï¼å¾å½¢è®¾å¤æ¥å£ï¼ä¸èµ·ï¼å®ææååå¾å½¢ãå¾åçæ¾ç¤ºå·¥ä½ãæCDCæ³è±¡æä¸å¼ 纸ï¼æ¯ä¸ªçªå£é½æä¸ä¸ªCDCç¸èç³»ï¼è´è´£ç»çªå£ãCDCæ个常ç¨åç±»CClientDCï¼çªå£å®¢æ·åºï¼ï¼ç»å¾é常éè¿CClientDCå®æã
CDialog对è¯æ¡
CWinAppåºç¨ç¨åºç±»ãä¼¼äºCä¸çmainå½æ°ï¼æ¯ç¨åºæ§è¡çå ¥å£å管çè ï¼è´è´£ç¨åºå»ºç«ãæ¶çï¼ä¸»çªå£åæ档模æ¿ç建ç«ãæ常ç¨å½æ°InitInstanceï¼ï¼ï¼åå§åã
CGdiObjectååç±»,ç¨äºå设å¤ææ¬ç»å¾ãå®ä»¬é½éè¦å¨ä½¿ç¨åéè¿DCã
CPenç¬ï¼ç»çº¿
CBrushå·åï¼å¡«å
CFontåä½ï¼æ§å¶æåè¾åºçåä½
CBitmapä½å¾
CPaletteè°è²æ¿
CRgnåºåï¼æå®ä¸ååºåå¯ä»¥ç¨äºåç¹æ®å¤çã
CFileæ件ãæéè¦çä¸å¤æ¯Openï¼æå¼ï¼,Readï¼è¯»å ¥ï¼,Writeï¼åï¼
CStringå符串ãå°è£ äºCä¸çå符æ°ç»ï¼é常å®ç¨ã
CPointç¹ï¼å°±æ¯ï¼x,yï¼å¯¹
CRectç©å½¢ï¼å°±æ¯ï¼left,top,right,bottomï¼
CSize大å°ï¼å°±æ¯ï¼cx,cyï¼å¯¹ï¼å®½ãé«ï¼
ä¸ãç¨å¥½MSDNåä¾å
ä½ä¸ºæé«ï¼æ¨èççä¾åæï¼
nHelloæç®åçç¨åºæ¡æ¶
nScribbleé¼ æ ç»å¾ãæç¨ï¼ç¼ç¨åºç¡ï¼GDI
nDiblookå¾åå¤çæç®åèä¾
nMFCIEå ç¹ç½æµè§å¨
nEnrollæ°æ®åº
nDaoviewDao(æ°æ®è®¿é®å¯¹è±¡ï¼èä¾ãæ åååè§æ§ä»¶
nCubeOpenGLèä¾ï¼ç»ä¸ä¸ªä¸ææ转çæ¹å
nHierSvrOLEæå¡å¨
nOclientOLEå 容å¨
nDrawclié¼ æ ç»å¾ãä¹å æ¬OLEã
nWordPadååæ¿ãOLE
åãå ç¹ç»éª
A.为ä»ä¹è¦ç¨Windowsèä¸æ¯DOSç¼ç¨
Windowsç¼ç¨å¹¶ä¸æ¯DOSç¼ç¨é¾å¾å¤ï¼åªæ¯å¨ååæ¥è§¦çæ¶åæå°å¤´ç»ªç¹å¤ï¼ä¸ç¥ä»ä½ä¸æãå®é ä¸ï¼å¦æä½ ä¼Cè¯è¨ï¼ä½ ä¼åç°Windowsç¼ç¨çé¾åº¦å¹¶ä¸æ¯å½å¹´å¦Cè¯è¨æ¶å¤§ãDOSç¼ç¨è¦æ³æ为é«æï¼ä¹éè¦å¦ä¹ å ç¾ä¸ªå½æ°ï¼æ 论æ¯TCãBCãMicrosoftCï¼ï¼å¹¶è¦æ·±å ¥äºè§£æ±ç¼è¯è¨çº§çDOSåè½è°ç¨ãèç°å¨å¨Windowsä¸ï¼ä»åºç¸åçå·¥ä½éï¼ä½ å´å¯ä»¥è·å¾å åçæ¶çãå¦æä½ ä»¥åçæDOSç¼ç¨ï¼ç°å¨åæWindowsç¼ç¨ï¼åªè¦ä¸¤ä¸ªææè¯å®ä¼æå°å·¨å¤§çä¼è¶æ§ï¼å¨DOSä¸ï¼æ¯ä¸ä»¶äºé½è¦èªå·±å¹²ï¼èä¸è¿æKå åãæ¾ç¤ºç²¾åº¦ççéå¶ï¼å®å¨æ¯äºåååäºã
B.为ä»ä¹è¦ç¨VCèä¸æ¯å ¶ä»Windowsç¼ç¨è¯è¨
n大å¤æ°å¤§å软件ï¼å æ¬Windowsèªå·±ï¼é½æ¯ç¨CãC++ç¼çï¼æ以å¯ä»¥å©ç¨çæºä»£ç ç¹å«å¤ãä¾å¦Photoshopï¼å°±æVCçç¼ç¨æ¥å£ãçå ¶ä»çè¯è¨é½ä¸å¦VCæåå²ä¼å¿ãèä¸VCçå¼åå·¥å ·ç¹å«å¤ï¼ä»æ§ä»¶å ¬å¸å°ç¡¬ä»¶å¼ååï¼å ¶äº§åå¾å°æ¢ä¸æä¾VCæ¥å£çã
nVCéåç»ç»å¤§å·¥ç¨ï¼VBå°±ä¸è¡ï¼
nBorlandC++æC++Builderä¹å¾ä¸éï¼å¹¶ä¸æ¯VCå·®ãä½BCççæ¬å ¼å®¹æ§ä¸å¥½ï¼ä»3.1å°4.0å°±åºç°â代æ²âï¼èä¸VCæä¾äºæ为丰å¯çææ¡£åèä¾,VCçåèèµæä¹è¿æ¯BCå¤ã并ä¸VCä¸å ¶ä»çVisualStudioæåå¯ä»¥åè°å·¥ä½ï¼å¯¹è½¯ä»¶å·¥ç¨æå©ã
n
C.å¼å§ä¸è¦å¦WinAPIç¼ç¨ï¼ä½ä»¥åæ好å¦å¦WinAPI
ç¹å«è¦æ³¨æï¼å¼å§ä¸è¦ä¹°è®²WindowsSDKç¼ç¨ç书ãä¸ä¸ªèåæèçä¾åå°±æ¯âHelloWorldâãåç§è®¡ç®æºè¯è¨å¨å ¥é¨è¯¾ä¸å¾å¾é½ç»åºä¸ä¸ªä¾åï¼æ¾ç¤ºä¸è¡æåâHelloWorldâï¼æ 论æ¯å¨BasicãCãPascalï¼çè³æ±ç¼ä¸ï¼è¿ä¸ªæç®åçå°ç¨åºé½å è¡å°±å¯ä»¥åå®ãä½å¨æ©æçWindowsç¼ç¨ä¸ï¼åæ讲å°çâHelloWinâè¿ä¸ªæåçä¾åå°±è¦ç»ç»ä¸ä¸ªå·¥ç¨ãåä¸å ç¾è¡ä»£ç æè½å®ç°ãè¿å°±åè·äºå¾å¤æ³å¦Windowsç¼ç¨ç人ãå®é ä¸ï¼å¨Windowsä¸æ¾ç¤ºâHelloworldâ,æç®åçæ¹æ³åªè¦5è¡å°±å¤äºï¼
#includeâwindows.hâ
voidWinMain()
{
MessageBox(NULL,âHelloWorld!â,âMyFirstWindowsApplicationâ,MB_OK);
}
å½ç¶è¿ä¸ªç¨åºåªå»ºç«äºä¸ä¸ªæç®åç对è¯æ¡ï¼ä½è¿å·²ç»å¤äºã
å¦æä½ æ²¡æSDKç¼ç¨çç»éªï¼å¦VCå°±æ¯è¦å©ç¨MFCç»è¿Windowsç¼ç¨ç许å¤ç»èãæ好çå·¥å ·ä¸ºä»ä¹ä¸ç¨å¢ï¼ç°å¨ä½ å¨VCåä¸ä¸ªâHelloWorldâï¼åªè¦åä¸è¡ä»£ç å°±å¯ä»¥äºã
voidCYourView::OnDraw(CDC*pDC)
{
//â¦â¦.å ¶ä»ç代ç
pDC->TextOut(,,âHelloWorld!â);
}
ä½MFCä¸æ¯ä¸è½çï¼WinAPIåVCä¸æå¾å¤åè½å¨MFCä¸å¹¶ä¸è½åæ åºæ¥ãå¨å ¥é¨åï¼è¦æ³åæ¥VCçå®å ¨è½åï¼WindowsAPIè¿æ¯é常éè¦çãèä¸ï¼è¿äºAPIå¨å ¶ä»Windowsè¯è¨ä¸ä¹ç¨å¾å°ã
å¦è¯è¨ï¼ä¸ç»æ¦éçä¹å·®ä¸å¤ãVCãVBãDlphiãVFPï¼ä»¥åå ¶ä»çWindowsç¼ç¨è¯è¨ï¼é½å±äºåä¸ä¸ªé¨æ´¾ï¼Windowsé¨ï¼è½ç¶æå¼ä¸åï¼ä½å åé½æ¯ä¸æ ·çï¼è¿å°±æ¯WindowsAPI(åºç¨ç¼ç¨æ¥å£)ï¼å¤§æ¦æ¯ä¸¤å个å½æ°ãä»»ä½æ¦åï¼æå¼å³ä½¿åå¤æï¼é常ä¹è½å¨å¾çæ¶é´å è®°ä¸æ¥ï¼ä½å åå°±ä¸æ¯ä¸æä¸å¤çäºãèä¸ï¼åé¨æ´¾çå åä¸åï¼UnixãLinuxé¨æUinxçå åï¼Apple(è¹æ)é¨æMacçå åï¼Javaæ´æ¯èªæä¸æ´¾ãæ们è¿é说çå¦VCï¼åªæ¯å¦æå¼ï¼å¦æå¼ä¸ä¸ªæå·®ä¸å¤å°±å¤äºï¼èªæç两个ææå°±å¯ä»¥ææ¡ãå å¦æå¼ï¼åå¬äººæ¯å¤äºï¼ä½åé«æä¸è¿æï¼éåºä¸ä¸å¯ãè¦æ³ç²¾éVCï¼å¿ é¡»çæWindowsAPIã
D.é«çº§è¯è¨ä¸èªç¶è¯è¨
ä¸é¨é«çº§è¯è¨ä¸ä¸é¨èªç¶è¯è¨æ¯ç±»ä¼¼çãå ³é®è¦ç´ æä¸ï¼
è¯æ³ï¼äºè§£CåC++åºæ¬è¯æ³ï¼è¿æ¯æ¯è¾å®¹æçã
ä¿®è¾ï¼ç¼ç¨çèºæ¯åé£æ ¼ãé常ï¼è¿æ¯ä¸è½¯ä»¶å·¥ç¨è系起æ¥çãç®æ³ä¸çå°ä¼ä¿©å¹¶éæ¯å ³é®çã严谨ï¼ä¸¥æ ¼æç §è§èå»åï¼åæ¶åè½åæ¥åºæ大çåé æ§ï¼ææ¯è¯è¨å¦å®¶çæ¬è²ã
è¯æ±ï¼å¦ä½å©ç¨å«äººçå·¥ä½ï¼å¦ä½å©ç¨èªå·±ä»¥åçå·¥ä½ï¼è¿æ¯ä¸ä¸ªè½¯ä»¶å·¥ç¨å¸æåçå ³é®ãå¦æè¯æ±éä¸ä¸°å¯ï¼å°±åä¸åºå¥½æç« ï¼å°±ä¼ææ³æ³è¡¨è¾¾ä¸åºãä¸ä¸ªäººçè¯æ³å¨ä¸å°å¦ä¹åå°±åºæ¬ä¸å¦æäºï¼ä¿®è¾æ°´å¹³ä¹å¨å¹´è½»æ¶å°±ç¡®å®äºï¼ææè¯æ±ééè¦æ ¹æ®éè¦ä¸æå¦ä¹ ãä¸ææ©å ãVCç¼ç¨ä¸ï¼æ¥æ大çè¯æ±éå°±æå³çè¦ææ¡è¾å¤çç±»ãå½æ°åå ¶ä»ç¼ç¨ç»ä»¶ãå¦ï¼WindowsSDK,MFC,以åä½ æä¸æ»çé¢åçç°æçSDKï¼æ¯å¦3Dç¼ç¨ä¸çOpenGL,å¤åªä½ç¼ç¨ä¸çDirectXï¼å¾åå¤çä¸çVictoråºãå¦å¤ï¼ActiveXæ§ä»¶çææ¡å¾å¾ä¹æ¯æè´¥çå ³é®ãæ们è¿å å¹´çå·¥ä½ä¹æ»ç»æäºä¸ä¸ªç±»åºï¼å«IPXï¼å¾åå¤çæ¡æ¶ï¼ï¼å¤§å¤§ç®åäºå¾åå¤ççå·¥ä½ï¼ä¸è¿ç°å¨è¿æå¾å¤ç»èé®é¢è¦è§£å³ï¼å¦ææåå¦æå ´è¶£å¯ä»¥åä¸è¿æ¹é¢çå·¥ä½ã
å¦ä¹ VCï¼åä¸ä¸è¦ç¨æ们å¨å¦æ ¡éå¦è±è¯çæ¹æ³ï¼èè¦ç¨å°å©å¦è¯´è¯çæ¹æ³ãæè°å¦è±è¯çæ¹æ³ï¼å°±æ¯æ们å¨æ¬ç§æ¶å¦Cè¯è¨çé£ç§æ¨¡å¼ï¼è¯¦ç»æææ¯ä¸ä¸ªç»èï¼è大éçè§åï¼å¾å°ä¸æºå®è·µï¼æ²¡æå®é é®é¢ä¾è§£å³ï¼æåç±èè¯æ¥æå®å¦ä¹ ææãè¿ç§æ¨¡å¼çåæ大家é½æ¸ æ¥ï¼æ们å¦äºåå å¹´è±è¯ï¼å¯æä¸å°äººè¿åªä¼åäºå个åè¯ï¼åç¾æåçæç« ï¼ä¸ä¼è¯´ï¼ä¸è½å¬ï¼å°¤å ¶è¦å½çæ¯ï¼çä¸æVCç帮å©ææ¡£ãæ们è¦è±¡å©´å¿ä¸æ ·ï¼å¨ä½¿ç¨ä¸å¦ä¼è¯æ³ãä¿®è¾åè¯æ±ï¼ä¸å¼å§è¯å®åªè½ç¼åºæç³ç³çï¼å°±å¥½è±¡å°å©å¼å§åªä¼è¯´ï¼âç¸ç¸å车车âï¼ä½âç¸ç¸ââ车车âè¿äºè¯å¯¹å°å©æ¯æéè¦çï¼å¦ä¹ çæçåèæé«ãå¦VCçæ¶åï¼åºä»æçéè¦åºåï¼å åä¸ä¸ªæç®åçä¸è¥¿ï¼ç¶åä¸ç¹ä¸ç¹å¤æèµ·æ¥ï¼è±¡æ»éªçä¸æ ·ã
å¦ä¹ VCå°¤å ¶è¦åå«äººäº¤æµï¼ä½ è¦è¦æèä¸æç½çï¼ä¹è®¸å«äººæ©å°±è§£å³äºãä¸å®è¦åäºå¦ä¹ ï¼ä»ä¹¦åºæ¾åºæç¨ç书ï¼å身边çé«æå¦ä¹ ï¼å¯»æ¾å¯ä»¥å©ç¨çæºä»£ç ãç±»åºãç»ä»¶ãæ§ä»¶ãåºï¼å¦æè½ä¸äºè¿ç½ï¼é£å°±æ´å è½è§£å³é®é¢äºã
åèèµæï¼/.html
Flink mysql-cdc connector 源码解析
Flink 1. 引入了 CDC功能,用于实时同步数据库变更。源码p源Flink CDC Connectors 提供了一组源连接器,源码p源支持从MySQL和PostgreSQL直接获取增量数据,源码p源如Debezium引擎通过日志抽取实现。源码p源以下是源码p源020系统源码Flink CDC源码解析的关键部分:
首先,MySQLTableSourceFactory是源码p源实现的核心,它通过DynamicTableSourceFactory接口构建MySQLTableSource对象,源码p源获取数据库和表的源码p源信息。MySQLTableSource的源码p源getScanRuntimeProvider方法负责创建用于读取数据的运行实例,包括DeserializationSchema转换源记录为Flink的源码p源RowData类型,并处理update操作时的源码p源前后数据。
DebeziumSourceFunction是源码p源底层实现,继承了RichSourceFunction和checkpoint接口,源码p源确保了Exactly Once语义。源码p源ai扫雷源码open方法初始化单线程线程池以进行单线程读取,run方法中配置DebeziumEngine并监控任务状态。值得注意的是,目前只关注insert, update, delete操作,表结构变更暂不被捕捉。
为了深入了解Flink SQL如何处理列转行、与HiveCatalog的python源码修订结合、JSON数据解析、DDL属性动态修改以及WindowAssigner源码,可以查阅文章。你的支持是我写作的动力,如果文章对你有帮助,请给予点赞和关注。
本文由文章同步助手协助完成。福瑞源码
CDIB什么意思
VC里的类
Visual C++ MFC中没有提供一个专门的类来处理DIB位图,因此,为了方便地使用位图文件,我们有必要派生一个CDib类。类的源代码如下:
(1) CDib类的声明
// DIB.h:类CDib声明头文件
#ifndef __DIB_H__
#define __DIB_H__
#include <wingdi.h>
class CDib
{
public:
CDib();
~CDib();
BOOL Load( const char * );
BOOL Save( const char * );
BOOL Draw( CDC *, int nX = 0, int nY = 0, int nWidth = -1, int nHeight = -1, int mode = SRCCOPY);
BOOL SetPalette( CDC * );
private:
CPalette m_Palette;
unsigned char *m_pDib, *m_pDibBits;
DWORD m_dwDibSize;
BITMAPINFOHEADER *m_pBIH;
RGBQUAD *m_pPalette;
int m_nPaletteEntries;
};
#endif
(2) CDib类的实现
// DIB.cpp:类CDib实现文件
#include "stdafx.h"
#include "DIB.h"
CDib::CDib()
{
m_pDib = NULL;
}
CDib::~CDib()
{
// 如果位图已经被加载,释放内存
if (m_pDib != NULL)
delete []m_pDib;
}
下面这个函数非常重要,其功能为加载位图,舆情检测源码类似于CBitmap类的LoadBitmap函数:
BOOL CDib::Load(const char *pszFilename)
{
CFile cf;
// 打开位图文件
if (!cf.Open(pszFilename, CFile::modeRead))
return (FALSE);
// 获得位图文件大小,并减去BITMAPFILEHEADER的长度
DWORD dwDibSize;
dwDibSize = cf.GetLength() - sizeof(BITMAPFILEHEADER);
// 为DIB位图分配内存
unsigned char *pDib;
pDib = new unsigned char[dwDibSize];
if (pDib == NULL)
return (FALSE);
BITMAPFILEHEADER BFH;
// 读取位图文件数据
try
{
// 文件格式是否正确有效
if ( cf.Read(&BFH, sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER) ||
BFH.bfType != ’MB’ || cf.Read(pDib, dwDibSize) != dwDibSize)
{
delete []pDib;
return (FALSE);
}
}
catch (CFileException *e)
{
e->Delete();
delete []pDib;
return (FALSE);
}
// delete先前加载的位图
if (m_pDib != NULL)
delete m_pDib;
// 将临时Dib数据指针和Dib大小变量赋给类成员变量
m_pDib = pDib;
m_dwDibSize = dwDibSize;
// 为相应类成员变量赋BITMAPINFOHEADER和调色板指针
m_pBIH = (BITMAPINFOHEADER*)m_pDib;
m_pPalette = (RGBQUAD*) &m_pDib[sizeof(BITMAPINFOHEADER)];
// 计算调色板中实际颜色数量
m_nPaletteEntries = 1 << m_pBIH->biBitCount;
if (m_pBIH->biBitCount > 8)
m_nPaletteEntries = 0;
else if (m_pBIH->biClrUsed != 0)
m_nPaletteEntries = m_pBIH->biClrUsed;
// 为相应类成员变量赋image data指针
m_pDibBits = &m_pDib[sizeof(BITMAPINFOHEADER) + m_nPaletteEntries * sizeof (RGBQUAD)];
// delete先前的调色板
if (m_Palette.GetSafeHandle() != NULL)
m_Palette.DeleteObject();
// 如果位图中存在调色板,创建LOGPALETTE 及CPalette
if (m_nPaletteEntries != 0)
{
LOGPALETTE *pLogPal = (LOGPALETTE*)new char[sizeof(LOGPALETTE) + m_nPaletteEntries *sizeof(PALETTEENTRY)];
if (pLogPal != NULL)
{
pLogPal->palVersion = 0x;
pLogPal->palNumEntries = m_nPaletteEntries;
for (int i = 0; i < m_nPaletteEntries; i++)
{
pLogPal->palPalEntry[i].peRed = m_pPalette[i].rgbRed;
pLogPal->palPalEntry[i].peGreen = m_pPalette[i].rgbGreen;
pLogPal->palPalEntry[i].peBlue = m_pPalette[i].rgbBlue;
}
//创建CPalette并释放LOGPALETTE的内存
m_Palette.CreatePalette(pLogPal);
delete []pLogPal;
}
}
return (TRUE);
}
//函数功能:保存位图入BMP文件
BOOL CDib::Save(const char *pszFilename)
{
if (m_pDib == NULL)
return (FALSE);
CFile cf;
if (!cf.Open(pszFilename, CFile::modeCreate | CFile::modeWrite))
return (FALSE);
try
{
BITMAPFILEHEADER BFH;
memset(&BFH, 0, sizeof(BITMAPFILEHEADER));
BFH.bfType = ’MB’;
BFH.bfSize = sizeof(BITMAPFILEHEADER) + m_dwDibSize;
BFH.bfOffBits = sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER) + m_nPaletteEntries *sizeof(RGBQUAD);
cf.Write(&BFH, sizeof(BITMAPFILEHEADER));
cf.Write(m_pDib, m_dwDibSize);
}
catch (CFileException *e)
{
e->Delete();
return (FALSE);
}
return (TRUE);
}
下面这个函数也非常重要,其功能为在pDC指向的CDC中绘制位图,起点坐标为(nX,nY),绘制宽度和高度为nWidth、nHeight,最后一个参数是光栅模式:
BOOL CDib::Draw(CDC *pDC, int nX, int nY, int nWidth, int nHeight, int mode)
{
if (m_pDib == NULL)
return (FALSE);
// 获取位图宽度和高度赋值
if (nWidth == - 1)
nWidth = m_pBIH->biWidth;
if (nHeight == - 1)
nHeight = m_pBIH->biHeight;
// 绘制位图
StretchDIBits(pDC->m_hDC, nX, nY, nWidth, nHeight, 0, 0, m_pBIH->biWidth, m_pBIH->biHeight, m_pDibBits, (BITMAPINFO*)m_pBIH, BI_RGB, mode);
return (TRUE);
}
//函数功能:设置调色板
BOOL CDib::SetPalette(CDC *pDC)
{
if (m_pDib == NULL)
return (FALSE);
// 检查当前是否有一个调色板句柄,对于大于色的位图,为NULL
if (m_Palette.GetSafeHandle() == NULL)
return (TRUE);
// 选择调色板,接着实施之,最后恢复老的调色板
CPalette *pOldPalette;
pOldPalette = pDC->SelectPalette(&m_Palette, FALSE);
pDC->RealizePalette();
pDC->SelectPalette(pOldPalette, FALSE);
return (TRUE);
}
从整个CDib类的代码中我们可以看出,DIB位图的显示需遵循如下步骤:
(1)读取位图,本类中使用pDib = new unsigned char[dwDibSize]为位图中的信息分配内存,另一种方法是调用API函数CreateDIBSection,譬如:
m_hBitmap = ::CreateDIBSection(pDC->GetSafeHdc(),
(LPBITMAPINFO) m_lpBMPHdr, DIB_RGB_COLORS,
(LPVOID*) &m_lpDIBits, NULL, 0);
m_hBitmap定义为:
HBITMAP m_hBitmap;
(2)根据读取的位图信息,计算出调色板大小,然后创建调色板;
(3)调用CDib::SetPalette( CDC *pDC )设置调色板,需要用到CDC::SelectPalette及CDC::RealizePalette两个函数;
(4)调用CDib::Draw(CDC *pDC, int nX, int nY, int nWidth, int nHeight, int mode)函数绘制位图。在此函数中,真正发挥显示位图作用的是对StretchDIBits API函数的调用。StretchDIBits函数具有缩放功能,其最后一个参数也是光栅操作的模式。
下面给出DIB位图的打开及显示并在其中加入天极网logo的函数源代码。"DIB位图"父菜单下"打开"子菜单的单击事件消息处理函数为(其功能为打开位图并显示之):
void CBitMapExampleDlg::OnOpendibpic()
{
// 弹出文件对话框,让用户选择位图文件
CFileDialog fileDialog(TRUE, "*.BMP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|");
if (IDOK == fileDialog.DoModal())
{
// 加载位图并显示之
CDib dib;
if (dib.Load(fileDialog.GetPathName()))
{
CClientDC dc(this);
dib.SetPalette(&dc);
dib.Draw(&dc);
}
}
}
"DIB位图"父菜单下"标记"子菜单的单击事件消息处理函数为(其功能为给位图加上天极网logo):
void CBitMapExampleDlg::OnMarkDibpic()
{
// 弹出文件对话框,让用户选择标记logo
CFileDialog fileDialog(TRUE, "*.BMP", NULL, NULL, "标记位图文件(*.BMP)|*.bmp;*.BMP|");
if (IDOK == fileDialog.DoModal())
{
// 加载标记logo位图并与目标位图相与
CDib dib;
if (dib.Load(fileDialog.GetPathName()))
{
CClientDC dc(this);
dib.SetPalette(&dc);
dib.Draw(&dc, 0, 0, - 1, - 1, SRCAND);
}
}
c++å¨pictureboxä¸ç»å¾
å¨ç±»æ¹æ³ä¸å å ¥
CWnd *pWnd = GetDlgItem(IDC_PICTURE2);// âIDC_PICTURE2â 为æ§ä»¶ID
CDC* pDC = pWnd->GetDC();
CRect rect = 0;
GetDlgItem(IDC_PICTURE2)->GetWindowRect(rect);//
ScreenToClient(rect);
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->MoveTo(0,0);
pDC->LineTo(rect.Width(),rect.Height());
è°ç¨æ¤æ¹æ³å³å¯