调用Win32 API 之CreateCursor函数失败
Win SDK文檔,函數(shù)說明如下,
CreateCursor
CreateCursor該函數(shù)創(chuàng)建一個指定大小、位模式和熱點(diǎn)的光標(biāo)。
函數(shù)原型:HCURSOR CreateCursor(HINSTANCE htnst,int xHotSpot;int yHotSpot;int nWidth;int nHeight,CONST VOID *pvANDPlane,CONST VOID *pvXORPlane);
參數(shù)說明
hlnst:創(chuàng)建光標(biāo)的應(yīng)用程序的當(dāng)前實(shí)例句柄。
xHotSpot:指定光標(biāo)熱點(diǎn)的水平位置。
yHotSpot:指定光標(biāo)熱點(diǎn)的垂直位置。
nWidth:以像素為單位指定光標(biāo)的寬度。
nHeight:以像素為單位指定光標(biāo)的高度。
pvANDPlane:指向一個字節(jié)數(shù)組的指針,該數(shù)組包含光標(biāo)AND掩碼的位值,就象設(shè)備相關(guān)的單色位圖一樣。
pvXORPlane:指向一個字節(jié)數(shù)組的指針,該數(shù)組包含光標(biāo)XOR掩碼的位值,就象設(shè)備相關(guān)的單色位圖一樣。
返回值:如果成功,返回光標(biāo)的值;如果失敗,返回值為NULL(空),若想獲得更多錯誤信息,調(diào)用GetLastError函數(shù)。
備注:nWidth和nHeight參數(shù)必須指定一個當(dāng)前顯示驅(qū)動支持的寬度和高度,因?yàn)橄到y(tǒng)不能創(chuàng)建一個其他尺寸的光標(biāo),為了確定顯示驅(qū)動所支持的寬度和高度,請使用GetSystemMetrics函數(shù),指定SM_CXCUROR或SM_CYCURSOR值。在一個應(yīng)用程序關(guān)閉之前,必須調(diào)用DestroyCursor函數(shù)來釋放與光標(biāo)有關(guān)的任何系統(tǒng)資源。
速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;頭文件:winuser.h;庫文件:user32.lib。
? ? 功能是直接使用函數(shù)來創(chuàng)建光標(biāo);下面來看一下;
VC6新建一個單文檔工程;添加一個菜單;在菜單單擊處理函數(shù)中編寫調(diào)用代碼;
void CCurView::OnMenuitem32771() {// TODO: Add your command handler code hereCString str1;int* pCursorBuffer = (int *)malloc(132*132*4);for (int i=0;i<132*132; i++){pCursorBuffer[i] = 0x80ff0000;}HCURSOR hcursor = CreateCursor(AfxGetInstanceHandle(), 0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),pCursorBuffer,pCursorBuffer);str1.Format("%0x",hcursor);AfxMessageBox(str1);SetCursor(hcursor); }如上代碼段;嘗試如下情況;
? ? 第一個參數(shù),取NULL,或調(diào)用AfxGetInstanceHandle()返回當(dāng)前應(yīng)用程序?qū)嵗浔?#xff1b;
? ? 第2、3個參數(shù)是開始x、y坐標(biāo);
? ? 第4、5個參數(shù),光標(biāo)大小;輸入固定數(shù)值,或者調(diào)用GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN) 返回系統(tǒng)支持的值;
? ? 第6、7個參數(shù),根據(jù)說明是字節(jié)數(shù)組指針;內(nèi)容為光標(biāo)AND掩碼、XOR掩碼的位值;上面pCursorBuffer相關(guān)賦值代碼來自網(wǎng)上,我還不清楚含義;或嘗試此2參數(shù)直接輸入NULL;
以上情況,程序均掛掉或無任何輸出;
為了看是否創(chuàng)建成功,使用
? ? str1.Format("%0x",hcursor);
?? ?AfxMessageBox(str1);
來彈出返回句柄的值;均不會執(zhí)行到此而彈出消息框;
關(guān)于第一個參數(shù)應(yīng)用程序?qū)嵗浔?#xff0c;根據(jù)資料VC++有三種方法獲取,
1.AfxGetInstanceHandle():用這個函數(shù)可以直接獲得應(yīng)用程序的實(shí)例句柄
2.theApp.m_hInstance:利用全局的實(shí)例對象theApp的成員變量m_hInstance來獲得
3.AfxGetApp()->m_hInstance:利用AfxGetApp()獲得當(dāng)前應(yīng)用程序?qū)嵗囊粋€指針
主要是最后2個參數(shù)不知道如何定義;嘗試隨便定義2個字節(jié)數(shù)組,
byte buf1[]= {0x0,0x1,0x0,0x1,0x0,0x1,0x0,0x1};
byte buf2[]= {0x0,0x1,0x0,0x1,0x0,0x1,0x0,0x1};
數(shù)組指針賦給最后2個參數(shù);結(jié)果還是一樣;有時間再繼續(xù);
函數(shù)的MSDN說明在
? ??CreateCursor | Microsoft Docs
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的调用Win32 API 之CreateCursor函数失败的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bochs调试linux内核学习4 -
- 下一篇: 初步了解超图桌面版导入CityGML数据