6.有關(guān)NULL位圖的三個(gè)誤區(qū)修改版_第1頁
6.有關(guān)NULL位圖的三個(gè)誤區(qū)修改版_第2頁
6.有關(guān)NULL位圖的三個(gè)誤區(qū)修改版_第3頁
6.有關(guān)NULL位圖的三個(gè)誤區(qū)修改版_第4頁
6.有關(guān)NULL位圖的三個(gè)誤區(qū)修改版_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

NULL位圖是為了確定行中的哪一列是NULL值,哪一列不是。這樣做的目的是當(dāng)Select語句后包含存緩存命中失效的問題(點(diǎn)擊這個(gè)鏈接來查看CPU的緩存是如何工作的以及MESI協(xié)議)。下面讓我們來揭穿三誤區(qū)#6a:NULL位圖并不是任何時(shí)候都會(huì)用到正確表中不存在允許NULL的列,NULL位圖對(duì)于數(shù)據(jù)行來說會(huì)一直存在(數(shù)據(jù)行指的是堆或是聚集索引的葉子節(jié)點(diǎn))。但對(duì)于索引行來說(所謂的索引行也就是聚集索引和非聚集索引的非葉子節(jié)點(diǎn)以及非聚集索引的葉子節(jié)點(diǎn))NULL位圖就不是一直有效了。下面這條語句可以有效的證明這一點(diǎn):CREATETABLENullTest(c1INTNOTNULL);CREATENONCLUSTEREDINDEXNullTest_NCONNullTest(c1);GOINSERTINTONullTestVALUES(1);GOEXECsp_allocationMetadata'NullTest';GO你可以通過我的博文:InsideTheStorageEngine:sp_AllocationMetadata-puttingundocumentedsystemcatalogviewstowork.來獲得sp_allocationMetadata的實(shí)現(xiàn)腳本。讓我們通過下面的script來分別查看在堆上的頁和非聚集索引上的頁:DBCCTRACEON(3604);DBCCPAGE(foo,1,152,3);--pageIDfromSPoutputwhereIndexID=0DBCCPAGE(foo,1,154,1);--pageIDfromSPoutputwhereIndexID=2GO首先讓我們來看堆上這頁Dump出來的結(jié)果Slot0Offset0x60Length11RecordType=PRIMARY_RECORDRecordAttributes=NULL_BITMAPMemoryDump@0x685DC060再來看非聚集索引上的一頁Dump出來的結(jié)果:Slot0,Offset0x60,Length13,DumpStyleBYTERecordType=INDEX_RECORDRecordAttributes=誤區(qū)#6b:NULL位圖僅僅被用于可空列錯(cuò)誤NULLNULL對(duì)應(yīng)一位,但是數(shù)據(jù)庫(kù)中最小的單位是字節(jié),所以為了向上取整到字節(jié),NULL位圖的位數(shù)可能會(huì)比列數(shù)要多。對(duì)于這個(gè)問題.我已經(jīng)有一篇博文對(duì)此進(jìn)行概述,請(qǐng)看:Misconceptionsaroundnullbitmapsize.誤區(qū)#6c:給表中添加額外一列時(shí)會(huì)立即導(dǎo)致SQLServer對(duì)表中數(shù)據(jù)的修改錯(cuò)誤r修改??傊琒QLServer存儲(chǔ)引擎會(huì)記錄一個(gè)或多個(gè)新添加的列并沒有反映在數(shù)據(jù)記錄中。第二篇:對(duì)話框位圖先謝謝各位的幫助,對(duì)于這個(gè)問題,圖片的導(dǎo)入功能已實(shí)現(xiàn),用的是CDibm_dib;m_dib.AttachMapFile(filename,TRUE);BOOLCDib::AttachMapFile(constchar*strPathname,BOOLbShare)//forreading{//ifweopenthesamefiletwice,Windowstreatsitas2separatefiles//doesn'tworkwithrareBMPfileswhere#paletteentries>biClrUsedHANDLEhFile=::CreateFile(strPathname,GENERIC_WRITE|GENERIC_READ,bShare?FILE_SHARE_READ:0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);ASSERT(hFile!=INVALID_HANDLE_VALUE);DWORDdwFileSize=::GetFileSize(hFile,NULL);HANDLEhMap=::CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);DWORDdwErr=::GetLastError();if(hMap==NULL){AfxMessageBox("Emptybitmapfile");returnFALSE;}LPVOIDlpvFile=::MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);//mapwholefileASSERT(lpvFile!=NULL);if(((LPBITMAPFILEHEADER)lpvFile)->bfType!=0x4d42){AfxMessageBox("Invalidbitmapfile");DetachMapFile();returnFALSE;}AttachMemory((LPBYTE)lpvFile+sizeof(BITMAPFILEHEADER));m_lpvFile=lpvFile;m_hFile=hFile;m_hMap=hMap;returnTRUE;}BOOLCDib::AttachMemory(LPVOIDlpvMem,BOOLbMustDelete,HGLOBALhGlobal){//assumescontiguousBITMAPINFOHEADER,colortable,image//colortablecouldbezerolengthm_hGlobal=hGlobal;if(bMustDelete==FALSE){m_nBmihAlloc=noAlloc;}m_nBmihAlloc=((hGlobal==NULL)?crtAlloc:heapAlloc);try{m_lpBMIH=(LPBITMAPINFOHEADER)lpvMem;ComputeMetrics();ComputePaletteSize(m_lpBMIH->biBitCount);m_lpImage=(LPBYTE)m_lpvColorTable+sizeof(RGBQUAD)*m_nColorTableEntries;MakePalette();}catch(CException*pe){AfxMessageBox("AttachMemoryerror");pe->Delete();returnFALSE;}returnTRUE;}我的程序的主要部分就這樣了,請(qǐng)各位幫下忙看下,要實(shí)現(xiàn)上述功能,可不可從我的程序中直接得到左上//下面這段代碼可以直接將你的位圖文件按你的需要裁剪成另一個(gè)位圖文件BITMAPFILEHEADERbmfHdr;BITMAPINFOHEADERbi,bi1;CFilefile("WhiteOnBlue.bmp",CFile::modeRead);file.Read(&bmfHdr,sizeof(BITMAPFILEHEADER));file.Read(&bi,sizeof(BITMAPINFOHEADER));DWORDdwSize=(bi.biWidth*bi.biBitCount+31)/32*4*bi.biHeight;PBYTEpBuf=newBYTE[dwSize];file.Read(pBuf,dwSize);file.Close();file.Open("Temp.bmp",CFile::modeCreate|CFile::modeReadWrite);memcpy(&bi1,&bi,sizeof(BITMAPINFOHEADER));bi1.biWidth=600;bi1.biHeight=400;DWORDdwSize1=(bi1.biWidth*bi1.biBitCount+31)/32*4*bi1.biHeight;PBYTEpBuf1=newBYTE[dwSize1];BYTE*pSrc,*pDest;for(inti=0;i<bi1.biHeight;i++){pSrc=pBuf+(bi.biWidth*bi.biBitCount+31)/32*4*(bi.biHeight-i1.biHeight+i);pDest=pBuf1+(bi1.biWidth*bi1.biBitCount+31)/32*4*i;memcpy(pDest,pSrc,(bi1.biWidth*bi1.biBitCount+31)/32*4);}file.Write(&bmfHdr,sizeof(BITMAPFILEHEADER));file.Write(&bi1,sizeof(BITMAPINFOHEADER));file.Write(pBuf1,dwSize1);file.Close();在對(duì)話框窗口內(nèi)繪圖(VC++)首先建立一個(gè)對(duì)話框類名為CMyDialog(當(dāng)然了,你也可你自己定一個(gè)你喜歡的類名),在對(duì)話框中放WM_PAINT消息添加函數(shù),然后輸入以下代碼:voidCMyDialog::OnPaint(){CWndpWndGetDlgItemIDCSTATIC);CDC*pControlDC=pWnd->GetDC();WndInvalidatepWnd->UpdateWindow();pControlDC->SelectStockObject(BLACK_BRUSH);pControlDC->Rectangle(0,0,10,10);pWnd->ReleaseDC(pControlDC);}以上代碼在靜態(tài)文本控件中畫了一個(gè)矩形框。讀取文件,得到BMP位圖矩陣,在對(duì)話框中逐點(diǎn)描繪.下面是讀取灰度BMP的函數(shù),256色,24位色類似.//COLORREFSwitchColor(unsignedcharc);boolShowImage(unsignedchar*image,intheight,intwidth,intx,inty)ReadBMP(char*file,BITMAPFILEHEADER_*bmph,BITMAPINFO_*bmpi,unsignedchar**data);ReadBMP(char*file,BITMAPFILEHEADER_*bmph,BITMAPINFO_nsignedchar**data){iposFILE*f=fopen(file,"rb");if(f==NULL)//判斷文件是否打開成功{alse}fseek(f,0,0);//移動(dòng)到開頭BMP文件頭if(fread((char*)bmph,sizeof(BITMAPFILEHEADER_),1,f)==NULL){alse}讀BMP信息頭if(fread((char*)bmpi,sizeof(BITMAPINFO_),1,f)==NULL){alse}fseek(f,bmph->Offbits,0);//定位位圖矩陣intskip=0;//填充象素?cái)?shù)if(bmpi->width%4==0)skip=0;skip=4-bmpi->width%4;iulongN=(bmpi->width)*(bmpi->height);//有效象素總數(shù)*data=(unsignedchar*)malloc(N);for(i=0;iwidth)*(bmpi->height);i++)//清空,變白色.{(*data)[i]=0xff;}unsignedcharwaste[8];pos=N-bmpi->width;for(i=0;iheight;i++)//讀入位圖矩陣{fread(&(*data)[pos],bmpi->width,1,f);fread(waste,skip,1,f);pos=pos-bmpi->width;}fclose(f);returntrue;}//////////////-boolShowImage(unsignedchar*image,intheight,intwidth,intx,int{for(i=0;ifor(j=0;jdc->SetPixel(j+x,i+y,SwitchColor(image[i*width+j]));}}returntrue;}COLORREFSwitchColor(unsignedcharc){return(0x00000000|(c<y)VC研發(fā)應(yīng)用程式的時(shí)候,經(jīng)常要在對(duì)話框上顯示位圖。如果把位圖加入資源中,當(dāng)然是省時(shí)省力,但本文就是介紹怎么在對(duì)話框上顯示位圖,并且怎么讓對(duì)話框自動(dòng)適應(yīng)位圖的大小的。條路:一是使用Kodak圖象編輯控件;二是利用Microsoft提供的例子中的一個(gè)類,并稍加改造。兩種方法各有優(yōu)缺點(diǎn)。我把他寫下來,以避免其他人多走彎路。一、利用控件覺,但卻不失為一個(gè)極方便快捷的方法。顧名思義,這個(gè)控件不僅能顯示,他更強(qiáng)大的功能還是在編輯圖象,他能對(duì)圖象進(jìn)行放大、縮小、標(biāo)注等操作。而且,使用起來非常方便。但他畢竟是別人的東東,不太不過有一臺(tái)卻顏色失真了,變成了水粉畫。不知是不是那臺(tái)機(jī)器的顯卡有問題。更有就是據(jù)我初步實(shí)驗(yàn),在95下好象行不通。不過目前大家都是WIN98,這似乎已不算一個(gè)問題了。下面就把我的過程寫下來:ll將他們分別注冊(cè)。打開VC,新建一個(gè)基于對(duì)話框的工程(主要是為了說明方便),刪除掉對(duì)話框上其他的東西(按鈕和tivexcontrolKodak會(huì)彈出一個(gè)對(duì)話框,大體上是提示你他要把控件加入工程中了,確定即可。在接下來的對(duì)話框上繼續(xù)點(diǎn)擊擊確定。字為m_ctrlPicture的控件,接下來就能利用他來顯示圖片了,我們把他m_ctrlPicture.SetImage("c:\\windows\Clouds.bmp");m_ctrlPicture.Display();不過他的大小卻是固定的,要看全圖只能利用滾動(dòng)條。下面我們?cè)賮淼玫綀D象的尺寸,然后使對(duì)話框自動(dòng)適應(yīng)圖象的大小。還是在初始化中,代碼如下:m_ctrlPicture.SetImage("c:\\windows\\Clouds.bmp");constintnAddConst=40;//圖象尺寸不會(huì)正合適,需要加點(diǎn)增量。longlPictureWidth=m_ctrlPicture.GetImageWidth();longlPictureHeight=m_ctrlPicture.GetImageHeight();MoveWindow(0,0,lPictureWidth,lPictureHeight,true);//改動(dòng)對(duì)話框大小//改動(dòng)控件的大小m_ctrlPicture.MoveWindow(0,0,lPictureWidth,lPictureHeight+nAddConst,true);m_ctrlPicture.Display();注意,這個(gè)控件不僅只能顯示bmp,還可顯示許多其他的格式,你能自己試一下。這個(gè)方法比較煩瑣,并且只能顯示bmp,但他不依賴特定的系統(tǒng),也比較實(shí)用。這個(gè)類在MSDN提供cdibht在對(duì)話框的頭文件中加入#include"cdib.h",然后給對(duì)話框類加入一個(gè)成員變量,代碼如下:Cdibm_dibFile;在對(duì)話框的初始化函數(shù)中,加入如下代碼:#ifdefMEMORY_MAPPED_FILESif(m_dibFile.AttachMapFile("c:\\windows\\clouds.bmp",TRUE)==TRUE){//shareInvalidate();}#elseCFilefile;file.Open("c:\\windows\\clouds.bmp",Cfile::modeRead);if(m_dibFile.Read(&file)==TRUE){Invalidate();}#endif//MEMORY_MAPPED_FILESCClientDCdc(this);m_dibFile.SetSystemPalette(&dc);ginWaitCursorm_dibFile.UsePalette(GetDC());CSizesizeFileDib=m_dibFile.GetDimensions();m_dibFile.Draw(GetDC(),CPoint(0,0),sizeFileDib);dWaitCursor運(yùn)行程式,是不是看到藍(lán)天白云了?!下面繼續(xù)加入讓對(duì)話框自動(dòng)適應(yīng)圖片大小的代碼,還是在初始化中,緊接這上一次的代碼,加入如下兩行:CSizesizeFileDib=m_dibFile.GetDimensions();MoveWindow(0,0,sizeFileDib.cx,sizeFileDib.cy,true);完全顯示了嗎?也許不完全合適,你能細(xì)微地調(diào)整cx,cy兩個(gè)參數(shù),使之適應(yīng)。底黑字更能吸引別人的眼球。設(shè)想如果html瀏覽器顯示的網(wǎng)頁都是白底黑字,還會(huì)有那么多的mm喜歡上網(wǎng)嗎?可能互聯(lián)網(wǎng)的人氣將下降一半。做個(gè)出色的界面對(duì)于老手來說可能不在話下,但是對(duì)于新手來說還是無從下手,使用BCGControlBar和XtremeToolkit是個(gè)很好的選擇,不過對(duì)于一個(gè)小程序使用這么大的庫(kù)N第一步:改變對(duì)話框的背景顏色如何改變對(duì)話框的背景顏色這個(gè)問題常常出現(xiàn)在論壇上,可見大家對(duì)Windows默認(rèn)的灰色對(duì)話框是多么不滿。MFC程序修改對(duì)話框的背景和文字顏色最簡(jiǎn)單的方法就是調(diào)用SetDialogBkColor函數(shù),CWinApp::SetDialogBkColor(COLORREFclrCtlBk,COLORREFclrCtlText);SetDialogBkColor(RGB(188,197,230),RGB(13,125,188));圖.1SetDialogBkColor效果圖使用SetDialogBkColor也有局限的地方,那就是所有的控件文字顏色都一樣,不能針對(duì)不同的控件設(shè)置話框的背景顏色和控件文字顏色也不是很困難的事情,并且這種方法能夠提供更靈活的顏色設(shè)置方案,比如對(duì)不同類型的控件使用不同的文字顏色,使用高亮度的背景顏色突出某個(gè)控件等等,最重要的是能夠控制Edit控件的文字和背景顏色,下面就介紹這種方法。當(dāng)Windows系統(tǒng)需要重畫某個(gè)窗口客戶區(qū)的背景的時(shí)候,就會(huì)向該窗改變對(duì)話框的背景顏色的原理很簡(jiǎn)單,就是響應(yīng)這個(gè)消息,用自定義的顏色填充對(duì)話框的客戶區(qū)背景,代WM_ERASEBKGND消息,是不是對(duì)話框沒有這個(gè)消息”?其實(shí)對(duì)話框也是窗口,它也有WM_ERASEBKGND消息,只是MFC的classwizard使用的dialog過濾器將其過濾掉了(只是在message窗口的顯示中過濾了,并不是真的不響應(yīng)這個(gè)消息),為的是代碼編寫過程中突出對(duì)話框?qū)S械南⒑涂丶录?。如圖。2所示,只要在classwizard中的“classinfo”table標(biāo)簽下將消息過濾器改成Windows就可以在對(duì)話框的消息列表圖.2修改消息過濾器ERASEBKGNDBOOLCCustDlgDlg::OnEraseBkgnd(CDC*pDC){CRectrcClient;GetClientRect(&rcClient);pDC->FillRect(&rcClient,&m_brBkgnd);eturnTRUE//returnCDialog::OnEraseBkgnd(pDC);}mbrBkgndCBrushTRUE是默認(rèn)的調(diào)用基圖.3重畫背景的效果使用位圖作為對(duì)話框的背景也不難,就是在整個(gè)客戶區(qū)畫一個(gè)位圖背景,看起來不如剛才效果好,控件文字的顏色和背景色都沒有改變,這是因?yàn)槲覀冞€沒有處理MFC消息特殊對(duì)待,如果父窗口沒有處理這個(gè)通知消息,MFC的窗口類就根據(jù)WM_CTLCOLOR通知消息的來源MFC對(duì)很多通知消息都做了反射,不過我們今天的例子沒有使用“消息反射”,我們?cè)诳丶母复翱?,也就ndowswsWM_CTLCOLORBTN按鈕控件WM_CTLCOLORDLG對(duì)話框WM_CTLCOLOREDIT編輯控件WM_CTLCOLORLISTBOX列表框控件WM_CTLCOLORSCROLLBAR滾動(dòng)條控件WM_CTLCOLORSTATIC靜態(tài)文本控件在這個(gè)函數(shù)中,我們可以通過改變pDC參數(shù)的屬性來改變控件的繪制,并返回相應(yīng)的畫刷句柄給控件,控件使用這個(gè)畫刷畫自己的背景。下面是我們修改后的OnCtlColor函數(shù):HBRUSHCCustDlgDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor){HBRUSHhbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);pDC->SetTextColor(m_clrText);pDC->SetBkMode(TRANSPARENT);return(HBRUSH)m_brBkgnd;//因?yàn)镃Brush類實(shí)現(xiàn)了HBRUSH類型轉(zhuǎn)換操作符//returnhbr;}orCWnd*pWnd,UINTnCtlColor){HBRUSHhbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);ifpWndGetDlgCtrlIDIDCEDITMULTILINEIDC_EDIT_MULTI_LINE是多行Edir控件的ID{pDC->SetTextColor(m_clrText);returnhbr;}else{pDC->SetTextColor(m_clrText);pDC->SetBkMode(TRANSPARENT);return(HBRUSH)m_brBkgnd;}}DHBRUSHCCustDlgDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor){HBRUSHhbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);TCHARszClassName[64];::GetClassName(pWnd->GetSafeHwnd(),szClassName,64);if(lstrcmpi(szClassName,_T("Edit"))==0)//是Edit控件{DWORDdwStyle=pWnd->GetStyle();if((dwStyle&ES_MULTILINE)==ES_MULTILINE)//多行edit控件{pDC->SetTextColor(m_clrText);returnhbr;}else{pDC->SetTextColor(m_clrText);pDC->SetBkMode(TRANSPARENT);return(HBRUSH)m_brBkgnd;}}else//不是編輯控件{pDC->SetTextColor(m_clrText);pDC->SetBkMode(TRANSPARENT);return(HBRUSH)m_brBkgnd;}}進(jìn)入討論組討論。下面我們針對(duì)每個(gè)控件設(shè)置特殊的顏色,區(qū)分控件可以通過控件的ID,修改控件背景也很簡(jiǎn)單,直接返回相應(yīng)的畫刷就可以了,下面就是顏色設(shè)置的完整代碼:HBRUSHCCustDlgDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor){HBRUSHhbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);TCHARszClassName[64];::GetClassName(pWnd->GetSafeHwnd(),szClassName,64);if(lstrcmpi(szClassName,_T("Edit"))==0)//是Edit控件{DWORDdwStyle=pWnd->GetStyle();if((dwStyle&ES_MULTILINE)==ES_MULTILINE)//多行edit控件{pDC->SetTextColor(m_clrText);returnhbr;}else{pDC->SetTextColor(m_clrText);pDC->SetBkMode(TRANSPARENT);return(HBRUSH)m_brBkgnd;}}else//不是編輯控件{if(pWnd->GetDlgCtrlID()==IDC_STC_REDTEXT){pDC->SetTextColor(RGB(255,0,0));pDC->SetBkMode(TRANSPARENT);return(HBRUSH)m_brBkgnd;}elseif(pWnd->GetDlgCtrlID()==IDC_STC_BLUETEXT){pDC->SetTextColor(RGB(0,0,255));pDC->SetBkMode(TRANSPARENT);return(HBRUSH)m_brBkgnd;}elseif(pWnd->GetDlgCtrlID()==IDC_STC_BLUETEXTWHITEBACK){pDC->SetTextColor(RGB(0,0,255));pDC->SetBkMode(TRANSPARENT);return(HBRUSH)m_brControlBkgnd1;}elseif(pWnd->GetDlgCtrlID()==IDC_CHK_GREEN){pDC->SetTextColor(RGB(0,255,0));pDC->SetBkMode(TRANSPARENT);return(HBRUSH)m_brBkgnd;}elseif(pWnd->GetDlgCtrlID()==IDC_RAD_BLUE){pDC->SetTextColor(RGB(0,0,255));pDC->SetBkMode(TRANSPARENT);return(HBRUSH)m_brBkgnd;}elseif(pWnd->GetDlgCtrlID()==IDC_CHK_GREEN2){pDC->SetTextColor(RGB(0,255,0));pDC->SetBkMode(TRANSPARENT);return(HBRUSH)m_brControlBkgnd2;}elseif(pWnd->GetDlgCtrlID()==IDC_RADIO2){pDC->SetTextColor(RGB(0,0,255));pDC->SetBkMode(TRANSPARENT);return(HBRUSH)m_brControlBkgnd2;}else{pDC->SetTextColor(m_clrText);pDC->SetBkMode(TRANSPARENT);return(HBRUSH)m_brBkgnd;}}}現(xiàn)在看看效果:or上面的代碼是根據(jù)控件ID來設(shè)置顏色,還可以根據(jù)控件的類型統(tǒng)一設(shè)置某種控件的顏色,這就要用到CTLCOLOR_BTNCTLCOLOR_DLGCTLCOLOR_EDITCTLCOLOR_LISTBOXCTLCOLOR_MSGBOXLORSCROLLBARCTLCOLORSTATICd圖填充客戶區(qū),只是在OnCtlColor中需要注意返回空畫刷代替原來的畫刷,返回空畫刷是為了阻止控件繪制自己的背景,從而破壞位圖背景的完整性,但是有時(shí)候返回空畫刷會(huì)對(duì)其他控件產(chǎn)生不良影響,所以我HBRUSHCBmpBkgndDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor){HBRUSHhbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);if(nCtlColor==CTLCOLOR_BTN||nCtlColor==CTLCOLOR_STATIC){pDC->SetTextColor(RGB(0,0,255));pDC->SetBkMode(TRANSPARENT);return(HBRUSH)m_HollowBrush;}pDC->SetTextColor(RGB(0,0,255));pDC->SetBkMode(TRANSPARENT);returnhbr;}背景和空畫刷的效果:圖.6使用位圖背景的效果第四步:?jiǎn)为?dú)處理按鈕控件圖.9對(duì)話框的最終效果pushbutton,我們先來看看控件自畫的原理。Windows的的外觀,但是許多控件有支持“自畫”,也就是讓用戶定制控件的外觀,當(dāng)給一個(gè)控件指定自畫的樣式之后,控件在重畫自己的時(shí)候向父窗口發(fā)送WM_MEASUREITEM和WM_DRAWITEM消息,父窗口響應(yīng)這兩個(gè)消息,定位控件的大小并繪制控件,從而使控件有定制的外觀。但是每個(gè)控件的自畫都由父窗口完成加重了父窗口的負(fù)擔(dān),也不利于代碼重用,所以,MFC對(duì)這些消息進(jìn)行了反射處理,就是將消息發(fā)。PreSubclassWindowPreSubclassWindow原因是在CSMButton子類化按鈕控件之前先給按鈕添加WM_MOUSEMOVE、WM_SETCURSOR和WM_KILLFOCUS四個(gè)消息的響應(yīng)函數(shù),對(duì)這四個(gè)消息的響應(yīng)是為了給按鈕增加更多的功能,比如使按鈕看起來象工具欄的按鈕,改變鼠標(biāo)的形狀等等。代碼以及用法,這里不在贅述。CSMButton類的功能很簡(jiǎn)單,但是完成了一個(gè)自畫按鈕的框架,大家可以修效果:圖.7使用自畫按鈕后的效果圖.8使用位圖m_hCat1=(HBITMAP)::LoadImage(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);GetDlgItem(IDC_STC_PICTURE)->SendMessage(STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)m_hCat1);裝載位圖還可以這樣:m_hCat1=(HBITMAP)::LoadImage(AfxGetResourceHandle(),(LPCTSTR)IDB_BITMAP1,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);這是最終的效果:我們先從簡(jiǎn)單的開始吧.先分一個(gè)類:(一)非動(dòng)態(tài)顯示圖片(即圖片先通過資源管理器載入,有一個(gè)固定ID)(二)動(dòng)態(tài)載入圖片(即只需要在程序中指定圖片的路徑即可載入)為方便說明,我們已經(jīng)建好一個(gè)基于對(duì)話框的工程,名為Ttest.(一)非動(dòng)態(tài)載入圖片.cture然后在對(duì)話框上添加一個(gè)picture控件,右鍵點(diǎn)擊打開屬性,拉開就會(huì)看到所有已經(jīng)載入好的圖片,選擇你要的圖片.運(yùn)行程序即可看到.IDIDB_BITMAP2TestDlg.h中CBrushmbrBk//在public中定義TestDlg.cpp中OnInitDialog加入:BOOLCTestDlg::OnInitDialog(){CDialog::OnInitDialog();CBitmapbmp;bmp.LoadBitmap(IDB_BITMAP2);m_brBk.CreatePatternBrush(&bmp);bmp.DeleteObject();...returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}在打開類向?qū)?找到WM_CTLCOLOR消息,重載得對(duì)應(yīng)函數(shù)OnCtlColor(),添加如下:HBRUSHCTestDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor){HBRUSHhbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);if(pWnd==this){returnm_brBk;}returnhbr;}(二)動(dòng)態(tài)載入圖片.2.打開工程,進(jìn)入資源管理器,在對(duì)話框上單擊右鍵,單擊InsertActivexcontrol…選擇Kodak圖象編輯3.在對(duì)話框上選中該控件,為其添加變量:m_ctrlPicture。。.在BOOLCTestDlg::OnInitDialog()添加如下:BOOLCTestDlg::OnInitDialog(){CDialog::OnInitDialog();m_ctrlPicture.SetImage("aa.jpg");//保證圖像在工程目錄下,也可以寫絕對(duì)路徑m_ctrlPicture.Display();returnTRUE;//returnTRUEunlessyousetthefocustoacontrol//EXCEPTION:OCXPropertyPagesshouldreturnFALSE}編譯運(yùn)行就OK了,此種方法的好處就是可能針對(duì)多種圖像格式.CTestDlg中聲明一個(gè)變量:CBitmapm_bmp;:BOOLCDisplayPic::OnInitDialog(){CDialog::OnInitDialog();if(m_bmp.m_hObject!=NULL)//判斷m_bmp.DeleteObject();/////////載入圖片HBITMAPhbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),"c:\aaa.bmp",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);if(hbmp==NULL)///////////////////////該斷程序用來取得加載的BMP的信息////////////////////////m_bmp.Attach(hbmp);DIBSECTIONds;BITMAPINFOHEADER&bminfo=ds.dsBmih;m_bmp.GetObject(sizeof(ds),&ds);intcx=bminfo.biWidth;//得到圖像寬度intcy=bminfo.biHeight;//得到圖像高度////////////////////////////////////////////////////////////////得到了圖像的寬度和高度后,我們就可以對(duì)圖像大小進(jìn)行適應(yīng),即調(diào)整控件的大小,讓它正好顯示一張圖片///////////////////////////CRectrect;GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect);ScreenToClientrect);GetDlgItem(IDC_STATIC1)->MoveWindow(rect.left,rect.top,cx,cy,true);//調(diào)整大小returnTRUE;//returnTRUEunlessyousetthefocustoacontrol//EXCEPTION:OCXPropertyPagesshouldreturnFALSE}圖片加載成功了,標(biāo)簽大小也適應(yīng)了,下面就是繪制繪制圖像了,打開類向?qū)?重載WM_PAINT消息voidCDisplayPic::OnPaint(){//////////////以下三種情況任選一種會(huì)是不同效果(只能一種存在)/////////////CPaintDCdc(this);//若用此句,得到的是對(duì)話框的DC,圖片將被繪制在對(duì)話框上.CPaintDCdcGetDlgItemIDCSTATICpictureDC,圖像將被繪制在控件上//CDCdc;//dc.m_hDC=::GetDC(NULL);//若用此兩句,得到的是屏幕的DC,圖片將被繪制在屏幕上///////////////////////////////////////////////////////CRectrcclient;GetDlgItem(IDC_STATIC1)->GetClientRect(&rcclient);CDCmemdc;memdc.CreateCompatibleDC(&dc);CBitmapbitmap;bitmap.CreateCompatibleBitmap(&dc,rcclient.Width(),rcclient.Height());memdc.SelectObject(&bitmap);CWnd::DefWindowProc(WM_PAINT,(WPARAM)memdc.m_hDC,0);CDCmaskdc;maskdc.CreateCompatibleDC(&dc);CBitmapmaskbitmap;maskbitmap.CreateBitmap(rcclient.Width(),rcclient.Height(),1,1,NULL);maskdc.SelectObject(&maskbitmap);maskdc.BitBlt(0,0,rcclient.Width(),rcclient.Height(),&memdc,rcclient.left,rcclient.top,SRCCOPY);CBrushbrush;brush.CreatePatternBrush(&m_bmp);dc.FillRect(rcclient,&brush);dc.BitBlt(rcclient.left,rcclient.top,rcclient.Width(),rcclient.Height(),&memdc,rcclient.left,rcclient.top,SRCPAINT);brush.DeleteObject();//DonotcallCDialog::OnPaint()forpaintingmessages}如果讀者有興趣可以向我索要以上方法的全部例程.zhucde@第三篇:量詞“個(gè)”的偏誤分析留學(xué)生學(xué)習(xí)漢語量詞“個(gè)”的偏誤分析及教學(xué)對(duì)策量詞“個(gè)”的泛化,而且量詞“個(gè)”的偏誤會(huì)一直伴隨學(xué)生學(xué)習(xí)的整個(gè)過程。造成這種錯(cuò)誤,不僅有“教”的原因,還有“學(xué)”的原因,有內(nèi)部的原因,也有外部的影響,應(yīng)采取有效辦法,幫助學(xué)生避免偏誤,促進(jìn)對(duì)外漢語教學(xué)水平的提高。我在對(duì)一些來中國(guó)學(xué)習(xí)漢語的短期進(jìn)修班的美國(guó)留學(xué)生進(jìn)行輔導(dǎo)的過程中,在學(xué)習(xí)說句子“我是一個(gè)美國(guó)人”時(shí),學(xué)生往往覺得奇怪,因?yàn)樵谟⒄Z里,同樣的意思說出來是“IamanAmerican”,即“數(shù)詞+名泛最普遍的量詞。學(xué)生在知道量詞是漢語的一大特色后,喜歡以不變應(yīng)萬變,所有的數(shù)詞和名詞之間都用便在后期,學(xué)生在掌握了一定數(shù)量的量詞后,當(dāng)出現(xiàn)新的事物名詞需要與數(shù)詞搭配時(shí),學(xué)生仍然會(huì)傾向先我覺得出現(xiàn)這種錯(cuò)誤的原因有以下幾個(gè)方面:1、對(duì)于漢語作為母語并經(jīng)常在生活中操練的人來說,對(duì)量詞的很多規(guī)則性的東西早已習(xí)以為常,而外國(guó)巧妙的方法,因此也助長(zhǎng)了他們對(duì)量詞“個(gè)”的依賴心理和使用時(shí)的取巧心理,鑄成了留學(xué)生對(duì)量詞學(xué)習(xí)的3、由于量詞并不是完全意義上的封閉性詞類,列舉起來是無窮無盡的,但是每個(gè)量詞都有自己的固定搭配,有一些量詞的用法又比較復(fù)雜,對(duì)于什么樣的量詞和什么樣的名詞/動(dòng)詞搭配只能憑借機(jī)械的記憶,當(dāng)學(xué)生碰到具體問題時(shí)就會(huì)感到無所適從,而在一些教材中對(duì)量詞“個(gè)”的解釋又比較籠統(tǒng)、抽象:“個(gè)”是使用非常廣泛的量詞,甚至還可以代替其他量詞。這雖然可以偶爾解決量詞缺失的現(xiàn)象,但在一定程度上也誤導(dǎo)了學(xué)生對(duì)量詞“個(gè)”的適用范圍。4、教師的知識(shí)、技能和對(duì)待教學(xué)的態(tài)度也是造成這一現(xiàn)象的重要因素。對(duì)外漢語教學(xué)的課堂具有開放性,教師具有很大的主觀隨意性,可是很多時(shí)候在涉及到量詞教學(xué),教師就刻意回避了語法等理論知識(shí)的講解,喜歡讓學(xué)生機(jī)械的模仿和記憶,并告訴學(xué)生這是漢語的一種習(xí)慣?!皞€(gè)”的用法雖然很廣但還是比較其他量詞的意義所在,消除學(xué)生可以用“個(gè)”就無需記憶運(yùn)用別的量詞的惰性心理。以上分析了留學(xué)生習(xí)得現(xiàn)代漢語量詞“個(gè)”時(shí)出現(xiàn)的偏誤及造成偏誤的原因,下面我將針對(duì)這些偏誤提出幾點(diǎn)對(duì)策,希望能很好地幫助留學(xué)生減少學(xué)習(xí)中的相關(guān)錯(cuò)誤?!北葲]有量詞強(qiáng);另一方面要加以正確的引導(dǎo),避免“化石化”的產(chǎn)生,在課堂教學(xué)中,遇到量詞時(shí),不僅要指出如說某些量詞的文化底蘊(yùn)、修辭作用及色彩意義等,尤對(duì)這些量詞的印象,這樣學(xué)生就更容易記住,在以后使用量詞時(shí)會(huì)仔細(xì)考慮,增強(qiáng)了學(xué)生的量詞的詞匯量和在現(xiàn)實(shí)生活中正確使用量詞的目的。2、教師在教學(xué)中的地位具有重要的作用,一個(gè)教師的嚴(yán)謹(jǐn)?shù)慕虒W(xué)態(tài)度對(duì)學(xué)生影響巨大。雖然量詞只是漢語教學(xué)中的一個(gè)組成部分,而量詞“個(gè)”又是量詞教學(xué)中的一小部分,但是作為學(xué)生最先接觸,接觸最多教授的意義就更為深刻了,如果學(xué)生基礎(chǔ)打得好,后面的學(xué)習(xí)偏誤就會(huì)少一些。教師要掌握量詞的基本語法知識(shí)和理論框架,還要掌握量詞的文化底蘊(yùn)和系源問題,等等,這樣才能在學(xué)生問起老師:一窗戶,為什么可以用“個(gè)”又可以用“面”、一個(gè)月亮為什么要說成一彎新月時(shí),不至于手足無措,回答學(xué)生:這只是個(gè)習(xí)慣,你記住都是對(duì)的就行了。一個(gè)心思細(xì)膩的教師還應(yīng)善于總結(jié)歸納學(xué)生的錯(cuò)誤,并找出一個(gè)行之有效的方法幫助學(xué)生糾正錯(cuò)誤。此外還應(yīng)對(duì)學(xué)生在每個(gè)學(xué)習(xí)階段所要接觸到的量詞以及這些量詞中“一3、語言是為交際服務(wù)的,量詞的學(xué)習(xí)也不例外,學(xué)生之所以在交際中廣泛用量詞“個(gè)”,是因?yàn)樗麄兏杏X到量詞在此時(shí)此景的表達(dá)中的不可缺少性,只是迫于不知道合適的量詞才被動(dòng)使用。如果教師教學(xué)和學(xué)生習(xí)得量詞的過程中有一個(gè)良好的語境或情境,那學(xué)生習(xí)得量詞的效率就會(huì)大大提高,再多做有針對(duì)性的練習(xí),那么偏誤率就會(huì)大大降低。所以,這就需要教師在量詞教學(xué)中要善于創(chuàng)造情境,而不是要求學(xué)生一味的機(jī)械模仿記憶,學(xué)生要敢于開口說,不回避,不放過每一個(gè)鍛煉的機(jī)會(huì),比如說可以開展一些量詞大聚會(huì)的表演(買菜/水果/散步寫景等等有量詞的場(chǎng)景表演),或?qū)W生之間的量詞大PK(看誰說的多,說的學(xué)生在初級(jí)階段學(xué)好量詞的信心和成就感;此外,還要樹立學(xué)生的語境意識(shí),教會(huì)學(xué)生自覺依靠語境,努力做到準(zhǔn)確、得體地選用量詞。以上就是我在實(shí)踐中發(fā)現(xiàn)的留學(xué)生學(xué)習(xí)漢語量詞“個(gè)”的偏誤問題,并對(duì)此提出的一點(diǎn)個(gè)人的建議和教學(xué)對(duì)策。由于知識(shí)儲(chǔ)備不足、理論分析能力有限,可能有一些方面分析的不是很到位,希望老師批評(píng)指正。量詞作為漢語的一大特色,留學(xué)生在學(xué)習(xí)的過程中遇到的難題遠(yuǎn)不止于此,希望能有更多的學(xué)者注意到這方面的問題,并給出更有實(shí)施性的對(duì)策方法,來提高對(duì)外漢語教學(xué)的效率。3的對(duì)比度(疊加、柔光、強(qiáng)光、亮光、點(diǎn)光、線性光)、對(duì)比上下圖層(差值、排除)、把一定量的上層圖像應(yīng)用的底層圖像中(色相、飽和度、顏色、亮度)。其中第二組和第三組的混合模式是完全相反的,比如正片疊底就是濾色的反模式。強(qiáng)光模式可以為圖像添加高光,而點(diǎn)光和線性光模式可以配合透明度的調(diào)整來為圖像增加紋理。色相和顏色模式可以為圖像色。1.不依賴其他圖層【正?!磕J绞荘S的默認(rèn)模式,在此模式下形成的合成色或者著色作品不會(huì)用到顏色的相減屬性?!救芙狻磕J綄a(chǎn)生不可知的結(jié)果,同底層的原始顏色交替以創(chuàng)建一種類似擴(kuò)散抖動(dòng)的效果,這種效原始圖像像素抖動(dòng)的頻率就越高。2.使底層圖像變暗【變暗】模式Photoshop將自動(dòng)檢測(cè)紅、綠、藍(lán)三種通道的顏色信息,選擇基色或混合色中較暗的作【正片疊底】模式Photoshop將自動(dòng)檢測(cè)紅、綠、藍(lán)三種通道的顏色信息并將基色與混合色復(fù)合,結(jié)果色也是選擇較暗的顏色,任何顏色與黑色混合將產(chǎn)生黑色,與白色混合保持不變,用黑色或白色以外的顏色繪畫時(shí),繪畫工具繪制的連續(xù)描邊產(chǎn)生逐漸變暗的顏色。【線性加深】模式Photoshop將自動(dòng)檢測(cè)紅、綠、藍(lán)三個(gè)通道中的顏色,通過減少亮度使基色變暗以3.使底層圖像變亮黑色亮的區(qū)域都可能加亮下面的圖像?!咀兞痢磕J絇hotoshop將自動(dòng)檢測(cè)紅、綠、藍(lán)三個(gè)通道的顏色信息,并且選擇基色或混合色中較亮的顏色作為結(jié)果色。比混合色暗的像素將被替換,比混合色亮的保持不變?!緫]色】模式Photoshop將自動(dòng)檢測(cè)紅、綠、藍(lán)三個(gè)通道的顏色信息,并將混合色的互補(bǔ)色與基色復(fù)合,結(jié)果色總是較亮的顏色,用黑色過濾時(shí)顏色將保持不變?!绢伾珳p淡】模式Photoshop將自動(dòng)檢測(cè)紅、綠、藍(lán)三個(gè)通道的顏色信息,并通過減小對(duì)比度使基色【線性減淡】模式Photoshop將自動(dòng)檢測(cè)紅、綠、藍(lán)三個(gè)通道的顏色信息,并通過增加亮度使基色變4.增強(qiáng)底層圖像的對(duì)比度【疊加】模式用于復(fù)合或過濾顏色,具體取決于基色,圖案或者顏色在現(xiàn)有的像素上疊加,同時(shí)保留色,但基色與混合色相混以反映原色的亮度或者暗度。【柔光】模式使顏色變暗或變亮,具體取決于混合色,此效果與發(fā)散聚光燈照在圖像上相似。如果混則圖像變暗,就像被加深了一樣。用純黑色或純白色繪畫會(huì)產(chǎn)生明顯的較亮或較暗的區(qū)域,但不會(huì)產(chǎn)生純【強(qiáng)光】模式用來復(fù)合或過濾顏色,具體取決于混合色。此效果與耀眼色聚光燈照在圖像上相似,如果混合色(光源)比50%的灰色亮,則圖像變亮,就像過濾后的效果,這對(duì)于向圖像添加高光非常有用。用純黑色或純白色繪圖時(shí)會(huì)產(chǎn)生純黑色或純白色?!玖凉狻磕J酵ㄟ^增加或減少對(duì)比度來加深或減淡顏色,具體取決于混合色,如果混合色(光源)比50%的灰色亮,則減小對(duì)比度使圖像變亮,如果混合色比50%的暗,則增加對(duì)比度使圖像變暗?!揪€性光】模式通過減小或增加亮度來加深或減淡顏色,具體取決于混合色,如果混合色比50%的灰色亮,則通過增加亮度使圖像變亮,如果混合色比50%的灰色暗,則通過減小亮度使圖像變暗。如果混合色比50%的灰色暗,則替換比灰褐色暗的像素,而比混合色暗的像素則保持不變,這對(duì)于向圖像特殊效果非常有用?!緦?shí)色混合】模式根據(jù)使用該圖層的填充不透明度設(shè)置使下面的圖層產(chǎn)生色調(diào)分離。設(shè)置填充不透明度高會(huì)產(chǎn)生極端的色調(diào)分離,而設(shè)置填充不透明度低則會(huì)產(chǎn)生較光滑的圖層。如果圖層的亮度接近50%的灰色,則下面的圖像亮度不會(huì)改變。5.比較上層與底層的圖層【差值】模式和【排除】模式是將上層的圖

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論