vc編程實例
⑴ 推薦本C++或者VC++的編程實例教程給我
《C++面向對象程序設計》譚浩強編的,堪稱是元老級的。很有用的。o(∩_∩)o...
⑵ 求c語言在vc環境下編程的界面實例
這只是核心代碼,實現把一個圖片分成9快打亂拼圖功能
裡面有不少系統自動生成的代碼 看你會不會用了
假設你已經會創建Windows項目,我就不多說了
如果要成功運行 你需要准備一個bmp文件,改名為00.bmp 和這個文件放同目錄
如果你還不能成功運行 我只能把整個項目打包給你了o(>﹏<)o
如有疑問,email到[email protected] 但不保證能及時回復
// 拼圖.cpp : 定義應用程序的入口點。
//
#include "stdafx.h"
#include "拼圖.h"
#include "time.h"
#define MAX_LOADSTRING 100
// 全局變數:
HINSTANCE hInst; // 當前實例
TCHAR szTitle[MAX_LOADSTRING]; // 標題欄文本
TCHAR szWindowClass[MAX_LOADSTRING];// 主窗口類名
int bmp[3][3]={0};
HDC hdcBmp;
POINT old={-1,-1};
int num[9]={9,8,7,6,5,4,3,2,1};
// 此代碼模塊中包含的函數的前向聲明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: 在此放置代碼。
MSG msg;
HACCEL hAccelTable;
// 初始化全局字元串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// 執行應用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MY);
// 主消息循環:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// 函數: MyRegisterClass()
//
// 目的: 注冊窗口類。
//
// 注釋:
//
// 僅當希望在已添加到 Windows 95 的
// 「RegisterClassEx」函數之前此代碼與 Win32 系統兼容時,
// 才需要此函數及其用法。調用此函數
// 十分重要,這樣應用程序就可以獲得關聯的
// 「格式正確的」小圖標。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_MY);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCTSTR)IDC_MY;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
//
// 函數: InitInstance(HANDLE, int)
//
// 目的: 保存實例句柄並創建主窗口
//
// 注釋:
//
// 在此函數中,我們在全局變數中保存實例句柄並
// 創建和顯示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // 將實例句柄存儲在全局變數中
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
void LoadingImage(HDC hdc)
{
HBITMAP hBmp = (HBITMAP)LoadImage(NULL,"00.bmp",IMAGE_BITMAP,300,300,LR_LOADFROMFILE );
hdcBmp = CreateCompatibleDC(hdc);
DeleteObject(SelectObject(hdcBmp,hBmp));
}
void DrawBmp(HDC hdc)
{
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
BitBlt(hdc,i*100,j*100,100,100,hdcBmp,(bmp[j][i]-1)%3*100,(bmp[j][i]-1)/3*100,SRCCOPY);
}
void random()
{
int i,j;
srand((unsigned)time(NULL));
for(i=0;i<3;i++)
for(j=0;j<3;j++)
while(true)
{
int t=rand()%9;
if (num[t])
{
bmp[j][i]=num[t];
num[t]=0;
break;
}
}
}
//
// 函數: WndProc(HWND, unsigned, WORD, LONG)
//
// 目的: 處理主窗口的消息。
//
// WM_COMMAND - 處理應用程序菜單
// WM_PAINT - 繪制主窗口
// WM_DESTROY - 發送退出消息並返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent,i,j,x,y,t;
PAINTSTRUCT ps;
HDC hdc;
//HBITMAP hBmp;
switch (message)
{
case WM_CREATE:
random();
hdc = GetDC(hWnd);
LoadingImage(hdc);
ReleaseDC(hWnd,hdc);
break;
case WM_LBUTTONDOWN:
x =LOWORD(lParam)/100;
y =HIWORD(lParam)/100;
if (old.x==-1)
{
old.x=y;
old.y=x;
}
else
{
t=bmp[old.x][old.y];
bmp[old.x][old.y] = bmp[y][x];
bmp[y][x] = t;
old.x=-1;
old.y=-1;
}
hdc=GetDC(hWnd);
DrawBmp(hdc);
ReleaseDC(hWnd,hdc);
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜單選擇:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意繪圖代碼...
DrawBmp(hdc);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// 「關於」框的消息處理程序。
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
⑶ C語言的學習
學習C語言,我想應當首先手頭有一本入門教材,如果有條件用計算機的話,在計算機上安裝TC程序。
前面的基本內容我想你自己會學好學會的,關鍵就是在指針以後的內容比較復雜抽象,需要下一番功夫才行呀。
如果有什麼問題可以在網上線我留言。QQ360795604
⑷ 用vc++實現usb介面通信編程的一般步驟
我來說下我做過的USB通信,我沒有做過DSP跟上位機的通信,我只做過ARM類的STM32跟上位機的數據傳遞,雖然做過但是也不是很 懂,只是略知一二,我來說說我怎麼做的吧,我是這么實現的:
USB是個很復雜的協議,你如果完全搞懂,我估計沒有幾個月專心鑽研是不行的,但是如果只是能實現你的這個功能,我估計不是很復雜。
首先來說說USB通信:
USB通信傳輸方式分為四種:控制,中斷,批量,同步傳輸四種,這個你可以看看網上資料,然後我用STM32通信,因為數據量不是很大,我用的是中斷傳輸方式,但是DSP數據量應該會比較大,不知道中斷傳輸行不行,但是一般問題不大。
傳輸方式說完了,再說說USB設備類型,你每次插usb設備到電腦上的時候就會有提示,這是一個什麼設備,USB設備類型就是說的這個意思,是滑鼠還是鍵盤還是別的什麼的,如果你選用標準的類,你就不用自己寫上位機(PC)的驅動程序,但是如果不用標準的類,就是用自定義的類就要自己寫上層的設備驅動程序,就是所謂的DDK,WDM,WDF什麼的,你沒寫過這方面的還真有點棘手,但是也不一定要寫驅動程序,你可以試試有個類叫HID類,這個類在USB通信的時候用的還挺多的,不過這個類也有缺點,這個地方還要說一點,USB還分低速,全速,高速三種,不太了解DSP,不知道他支持什麼模式,但是USB2.0的全速應該至少可以支持的。
USB2.0全速模式HID用中斷方式每秒最多可以傳輸64KB的數據,不知道能不能達到你的要求,但是我估計一般問題不大了,如果你這歀DSP能支持高速模式,每秒用這種方式可以傳輸高達22MB的數據,這個速度一般問題不大了。
你可以照著我說的思路,去網上搜搜人家寫好的程序,肯定有人做過DSP的USB通信,然後你按照自己的要求改一改,主要應該是USB的設備描述符部分要自己修改,然後可能還要根據自己的電路改改配置什麼的,上位機軟體網上有源代碼的多的是,然後自己摸索摸索,我估計你要是編程水平還可以的話,只是摸索USB,一兩個星期完全沒有問題,祝你好運!
⑸ 誰有數控磨床的VC++編程實例嗎
打開VC++6.0,按左上角菜單欄的「文件」-->「新建」,打開如下界面
⑹ vc 如何操作 excel2003(注意一定是2003) 編程
1.製作應用軟體的時候,經常要把結果以報表的形式輸出,當前使用較為廣泛的當然是Excel表格,本文簡略介紹在VC++6.0中如何使用Excel2003的庫函數並對其進行編程。先創建一個對話框工程,命名為VCExcel。在對話框中添加一個按鈕,控制項ID為2.ID_RUNEXCEL(是不是很搞笑哇,不過沒關系,它照樣能實現強大的功能)。
再在該按鈕上添加消息BN_CLICKED,其消息映射函數為OnRunexcel(),下面工作就是要完成這個OnRunexcel()函數。在這里我們通過一個實例來說明VC是如何調用Excel2003的介面編程的。
3.要編程輸出一個如下表格。
格式如下:
1)表頭的字體為宋體,加粗,顏色為白色,底色為深藍,垂直水平居中對齊;
2)表中正文內容字體為宋體,顏色為深藍,底色為灰色,垂直水平居中對齊;
3)全部邊框,文本自動換行。
在BOOL CVCExcelApp::InitInstance()之中,int nResponse = dlg.DoModal()語句之後加入如下代碼:
if(CoInitialize(NULL)==0)//初始化COM庫
{
AfxMessageBox("初始化COM失敗!");
exit(1);
}
在return FALSE;語句之前加入:::CoUninitialize();//釋放COM庫。
4.為了能調用Excel的介面我們打開MFC ClassWizard->Automation->Add Class->From a type library,選擇[Excel的安裝路徑]/EXCEL.exe,然後把所有的類都添加進去,頭文件為excel.h,源文件為excel.cpp。當然,你也可以只把一些比較常用的類如_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range加進去,因為網上流傳的絕大部分教程都只添加這幾個類,這完全根據個人的需要。至少還要用到Interior類(設置底色),Font類(設置字體),而且這樣做又簡單又方便擴展功能,不管三七二十一全部弄進去吧!但這樣做會有一個問題,有可能產生類的名字沖突,例如本來你自己寫了一個類叫Font,當你全部添加時又再次加入了Font類,這樣就重復定義了,不過可以通過名字空間來解決這個問題。再在VCExcelDlg.cpp文件的頭部添加(如果系統已經自動添加就不要重復添加了):
#include "VCExcel.h"
#include "comdef.h"
這樣一來程序就可以自由調用EXCEL了,一切准備就緒。
5.下面先在CVCExcelDlg中添加如下成員變數,用來操控Excel應用程序、工作簿和單元格。
Range m_ExlRge;
_Worksheet m_ExlSheet;
Worksheets m_ExlSheets;
_Workbook m_ExlBook;
Workbooks m_ExlBooks;
_Application m_ExlApp;
我們利用載入Excel模板來生成要求的表格,在本工程Debug文件夾中建立一個Excel文件,命名為Template.xls。我們的OnRunexcel()代碼如下(詳見注釋):
void CVCExcelDlg::OnRunexcel()
{
// TODO: Add your control notification handler code here
//用m_ExlApp對象創建Excel2003進程
if(!m_ExlApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("創建Excel服務失敗!");
return;
}
//設置為可見
m_ExlApp.SetVisible(TRUE);
///////////////////下面得到應用程序所在的路徑///////////////////
CString theAppPath,theAppName;
char Path[MAX_PATH];
GetMoleFileName(NULL,Path,MAX_PATH);//得到應用程序的全路徑
theAppPath=(CString)Path;
theAppName=AfxGetApp()->m_pszAppName;
theAppName+=".exe";
//把最後的文件名去掉
int length1,length2;
length1=theAppPath.GetLength();
length2=theAppName.GetLength();
theAppPath.Delete(length1-length2,length2);
////////////////////////////////////////////////////////////////
CString TempPath="";
TempPath=theAppPath+"Template.xls";//EXCEL模板的路徑
m_ExlBooks.AttachDispatch(m_ExlApp.GetWorkbooks(),TRUE);
m_ExlBook.AttachDispatch(m_ExlBooks.Add((_variant_t)TempPath),TRUE);//載入EXCEL模板
m_ExlSheets.AttachDispatch(m_ExlBook.GetSheets(),TRUE);//載入Sheet頁面
//添加新的Sheet頁面
m_ExlSheets.Add(vtMissing,vtMissing,_variant_t((long)1),vtMissing);
//刪除第二個Sheet頁面
m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(_variant_t((long)2)),TRUE);
m_ExlSheet.Delete();
//把第一個Sheet頁面的名字改變為TestSheet
m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(_variant_t((long)1)),TRUE);
m_ExlSheet.SetName("TestSheet");
///////合並第一行單元格A1至D1//////
//載入要合並的單元格 m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(_variant_t("A1"),_variant_t("D1")),TRUE);
m_ExlRge.Merge(_variant_t((long)0));
////////設置表格內容////////
m_ExlRge.AttachDispatch(m_ExlSheet.GetCells(),TRUE);//載入所有單元格
m_ExlRge.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("數學系研究生課程統計"));
m_ExlRge.SetItem(_variant_t((long)2),_variant_t((long)1),_variant_t("課程名"));
m_ExlRge.SetItem(_variant_t((long)2),_variant_t((long)2),_variant_t("課時"));
m_ExlRge.SetItem(_variant_t((long)2),_variant_t((long)3),_variant_t("難度"));
m_ExlRge.SetItem(_variant_t((long)2),_variant_t((long)4),_variant_t("教學方式"));
m_ExlRge.SetItem(_variant_t((long)3),_variant_t((long)1),_variant_t("泛函分析"));
m_ExlRge.SetItem(_variant_t((long)3),_variant_t((long)2),_variant_t("60"));
m_ExlRge.SetItem(_variant_t((long)3),_variant_t((long)3),_variant_t("普通"));
m_ExlRge.SetItem(_variant_t((long)3),_variant_t((long)4),_variant_t("老師講課"));
m_ExlRge.SetItem(_variant_t((long)4),_variant_t((long)1),_variant_t("微分流形"));
m_ExlRge.SetItem(_variant_t((long)4),_variant_t((long)2),_variant_t("40"));
m_ExlRge.SetItem(_variant_t((long)4),_variant_t((long)3),_variant_t("變態難"));
m_ExlRge.SetItem(_variant_t((long)4),_variant_t((long)4),_variant_t("自學"));
m_ExlRge.SetItem(_variant_t((long)5),_variant_t((long)1),_variant_t("二階橢圓型方程與方程組"));
m_ExlRge.SetItem(_variant_t((long)5),_variant_t((long)2),_variant_t("60"));
m_ExlRge.SetItem(_variant_t((long)5),_variant_t((long)3),_variant_t("很難"));
m_ExlRge.SetItem(_variant_t((long)5),_variant_t((long)4),_variant_t("討論"));
m_ExlRge.AttachDispatch(m_ExlSheet.GetUsedRange());//載入已使用的單元格
m_ExlRge.SetWrapText(_variant_t((long)1));//設置單元格內的文本為自動換行
//設置齊方式為水平垂直居中
//水平對齊:默認=1,居中=-4108,左=-4131,右=-4152
//垂直對齊:默認=2,居中=-4108,左=-4160,右=-4107
m_ExlRge.SetHorizontalAlignment(_variant_t((long)-4108));
m_ExlRge.SetVerticalAlignment(_variant_t((long)-4108));
///////設置整體的字體、字型大小及顏色//////
Font ft;
ft.AttachDispatch(m_ExlRge.GetFont());
ft.SetName(_variant_t("宋體"));//字體
ft.SetColorIndex(_variant_t((long)11));//字的顏色
ft.SetSize(_variant_t((long)12));//字型大小
///////////設置標題字體及顏色////////// m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(_variant_t("A1"),_variant_t("D1")));
ft.AttachDispatch(m_ExlRge.GetFont());
ft.SetBold(_variant_t((long)1));//粗體
ft.SetSize(_variant_t((long)13));
ft.SetColorIndex(_variant_t((long)2));
CellFormat cf;
cf.AttachDispatch(m_ExlRge.GetCells());
//////////////設置底色/////////////////
Interior it;
it.AttachDispatch(m_ExlRge.GetInterior());
it.SetColorIndex(_variant_t((long)11));//標題底色
////表格內容的底色//// m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(_variant_t("A2"),_variant_t("D5")));
it.AttachDispatch(m_ExlRge.GetInterior());
it.SetColorIndex(_variant_t((long)15));
//////////////為表格設置邊框/////////////
Range UnitRge;
CString CellName;
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
CellName.Format("%c%d",j+64,i);//單元格的名稱 UnitRge.AttachDispatch(m_ExlRge.GetRange(_variant_t(CellName),_variant_t(CellName)));//載入單元格
//LineStyle=線型 Weight=線寬 ColorIndex=線的顏色(-4105為自動) UnitRge.BorderAround(_variant_t((long)1),_variant_t((long)2),_variant_t((long)-4105),vtMissing);//設置邊框
}
}
//釋放對象(相當重要!)
m_ExlRge.ReleaseDispatch();
m_ExlSheet.ReleaseDispatch();
m_ExlSheets.ReleaseDispatch();
m_ExlBook.ReleaseDispatch();
m_ExlBooks.ReleaseDispatch();
//m_ExlApp一定要釋放,否則程序結束後還會有一個Excel進程駐留在內存中,而且程序重復運行的時候會出錯
m_ExlApp.ReleaseDispatch();
//退出程序 m_ExlApp.Quit();
}
⑺ 如何用vc編寫程序
第一篇
為Non-COM程序添加對象模型(2)
初始化對象模型
創建一個新的組件實例,調用Load方法來獲得一對結果。首先,連接到記事本運行中的拷貝。其次,在記事本窗口中打開一個已存在的文檔或創建一個空文檔。
與記事本相結合,需要奪取主窗體的句柄和覆蓋了整個客戶端區域的編輯控制項的句柄。可以用C++ FindWindow API函數檢索第一個打開的並且和記事本的Windows類名「notepad」相匹配的窗口(此後台信息已經可以由Spy++提供,它是一個Visual Studio工具,可以透視Windows的隱私),可以使用以下的C++代碼:
STDMETHODIMP
CNotepadApplication::Load(BSTR bstrFile)
{
m_hwnd = FindWindow(_T("notepad"), NULL);
if (!IsWindow(m_hwnd))
_StartApp(OLE2T(bstrFile));
Load方法嘗試找到一個運行中的記事本實例。如果成功,它忽略輸入的文件名。否則,它產生nodepad.exe,並用命令行傳遞bstrFile參數。
這是僅有的可能的方法來做到這些了。可以更改Load方法的行為遵守其他的規則。然而,需要注意的是,在程序的用戶介面中隱蔽地載入一個文本文件是通過命令行來實現的。否則,必須求助File菜單中的Open命令,但這就不是自動和隱蔽的了。
一旦找到了記事本主窗體的句柄,就可以利用它並使用C++代碼檢索子編輯控制項。
m_hwndEdit = FindWindowEx(
m_hwnd, NULL, _T("edit"), NULL);
記事本的結構提供了一個類名為「notepad」的窗口,它的客戶區域被一個編輯控制項占據——一個類名為「edit」的窗口。FindWindowsEx API函數檢索第一個類名為「edit」的窗口,它是m_hwnd的子女。
下一步,在COM對象中創建一個屬性,它描述子編輯控制項的內容。調用名為Text的可讀寫屬性。給它一個文本內容,它將會立即影響到記事本的緩沖區。
Set npad = CreateObject("NotepadOM.Application")
npad.Load ""
npad.Text = "Sample text"
在前面的代碼中,我們建立了一個新的未明名的文本文檔,它的內容已經被賦予了某個字元串。當然,可以使用Text屬性連接文本到其他變數中。
npad.Text = "Sample text"
npad.Text = npad.Text & vbCrLf & "for the article"
即使記事本是個SDI程序,也可能需要像清晰的對象調用過程那樣公開文本內容,例如文檔操作。這符合更清楚、更雅緻的模型設計,但是它仍需要為架構設計帶來多餘的復雜性。為什麼創建一個新的ATL對象僅僅是為了優化一些文本相關的功能呢?
在實現Text屬性時,利用了Windows32編輯控制項的一個鮮為人知的特性。所有Windows32控制項不能跨進程訪問。例如,不能請求另一個應用程序的rich edit box以字元串類型返回它的內容。產生這個問題的原因是,任何內存地址只在進程管理范圍內才有效。這個規則有少部分例外。
所有的Windows標准控制項buttons、listboxes、和edit controls或者其他控制項都不違背這項規則。它們的內容以在進程間被任意地讀或寫。這功能在Windows 95時為了保持向後兼容現存的Windows3x程序就出現了,它用進程間子類化。此同樣存在於Windows XP和Windows 2000中。
可以使用一些消息,如WM_GETTEXT和WM_SETTEXT來獲得或寫入文本框的內容而不顧實際進程的相關情況。同樣,當運行VBS腳本時,實際上已涉及到兩個不同的進程,記事本和wscript.exe,它們控制著VBS腳本。用C++實現此Text屬性,代碼如下:
STDMETHODIMP
CNotepadApplication::get_Text(BSTR *pVal)
{
USES_CONVERSION;
int nLen = 1 + SendMessage(m_hwndEdit, WM_GETTEXTLENGTH, 0, 0);
LPTSTR pszBuf = new TCHAR[nLen];
SendMessage(m_hwndEdit, WM_GETTEXT, nLen, (LPARAM) pszBuf);
*pVal = SysAllocString(T2OLE(pszBuf));
delete [] pszBuf;
return S_OK;
}
STDMETHODIMP
CNotepadApplication::put_Text(BSTR newVal)
{
USES_CONVERSION;
SendMessage(m_hwndEdit, WM_SETTEXT, 0, (LPARAM) OLE2T(newVal));
return S_OK;
}
添加編輯函數
訪問編輯控制項的句柄可以弄清編輯所需的一串函數——特別是關於文本選擇的部分。可以很容易地添加方法選擇所有的緩沖區中的文本或限制為某個區域選擇。SelectAll和SelectText用C++實現,方法如下:
STDMETHODIMP
CNotepadApplication::SelectText(
int nFrom, int nTo) {
SendMessage(m_hwndEdit, EM_SETSEL, nFrom-1, nTo-1);
return S_OK;
}
通過EM_SETSET消息可以很容易地在編輯控制項中實現文本選擇。在Windows32中,第一個可選的字元是在0位置,但是相關方法使它從1開始。而指定-1~0的范圍可以選擇整個文本。
編輯框中正文的字體名稱由某個注冊值lfFaceName決定,在以下位置可以找到此鍵值:
HKEY_CURRENT_USER
\Software
\Microsoft
\Notepad
將它設為想要用的鍵值。記事本在啟動之前讀取這個設置。為了使它生效,請記住在調用Load之前設置好它。
set npad = CreateObject("NotepadOM.Application")
npad.Font = "Lucida Console"
npad.Load "readme.txt"
當一個互動式的用戶單擊菜單時,例如「File | Open」,主窗體發送WM_COMMAND消息,其中WPARAM參數被賦予串聯的兩個字。低位字是命令的ID,高位字包含消息碼或表示觸發的值——鍵盤加速鍵或菜單。用C++調用一個菜單命令、發送一個WM_COMMAND消息到記事本,代碼如下:
SendMessage(m_hwnd, WM_COMMAND,
MAKELONG(nCommand,0), 0);
必須用特殊的工具為nCommand參數指出正確的值,就像Spy++。既然這樣,我稍微修改文章中所描述的DLL版本。「Hook,Line and Sinker」〔Visual C++ Developers Journal February 2001〕。此常式產生並鉤住,然後創建記事本的子類。它過濾窗口接收到的所有消息,並在命令代碼是WM_COMMAND時彈出對話框顯示command ID。
if (uiMsg == WM_COMMAND) {
// Get the value of LOWORD(wParam)
}
需要添加的僅僅是存儲或顯示命令代碼的程序。檢驗主記事本的菜單命令ID。只要給出了這個,調用菜單命令就很簡單了,代碼如下:
const NOTEPAD_FILE_OPEN = 10
Set npad = CreateObject("NotepadOM.Application")
npad.InvokeMenu NOTEPAD_FILE_OPEN
如果要編程關閉運行中的實例,需要想到在記事本窗口上調用DestroyWindows。然而,DestroyWindows只能在屬於同一進程的窗口的進程中調用。要卸載記事本,用C++簡單的發送一條退出代碼的WM_COMMAND消息:
SendMessage(m_hwnd, WM_COMMAND,
MAKELONG(28,0), 0);
有些功能是無法從非自動化的程序中獲得的。例如,打開文件和另存為是不可能實現的,因為程序並不通過消息或API暴露這些代碼,需要編寫代碼來存儲它。舉個例子來說,在記事本中,存儲運行時結果需要響應Save或Save As命令,但是它們都是互動式的命令,需要用戶單擊OK按鈕或輸入一個新的文件名。這是原解決方案固有的限制。
最近,在一個客戶中碰到一個相似的問題,我應要求在不同環境處理一些傳統的Windows程序(其中一個是記事本)。本質上來說,Win32 made-to-measure應用程序獲得TCP/IP通道指令並轉換它們以執行本地的Windows應用程序。通過Windows32消息請求服務的方式和在此所做的很相似。下一目標是用COM對象模型封裝此通信模式。
關於作者
Dino Esposito是Wintellect的ADO.NET專家和培訓師並且在羅馬當咨詢師。Dino是《Building Web Solutions With ASP.NET and ADO.NET》(微軟出版)一書的作者,是VB-2-The-Max (http://www.vb2themax.com <http://www.vb2themax.com>)的創始人。可通過[email protected]聯繫到Dino。
⑻ 求c語言在vc環境下編程的界面實例
這只是核心代碼,實現把一個圖片分成9快打亂拼圖功能
裡面有不少系統自動生成的代碼
看你會不會用了
假設你已經會創建Windows項目,我就不多說了
如果要成功運行
你需要准備一個bmp文件,改名為00.bmp
和這個文件放同目錄
如果你還不能成功運行
我只能把整個項目打包給你了o(>﹏<)o
如有疑問,email到[email protected]
但不保證能及時回復
//
拼圖.cpp
:
定義應用程序的入口點。
//
#include
"stdafx.h"
#include
"拼圖.h"
#include
"time.h"
#define
MAX_LOADSTRING
100
//
全局變數:
HINSTANCE
hInst;
//
當前實例
TCHAR
szTitle[MAX_LOADSTRING];
//
標題欄文本
TCHAR
szWindowClass[MAX_LOADSTRING];//
主窗口類名
int
bmp[3][3]={0};
HDC
hdcBmp;
POINT
old={-1,-1};
int
num[9]={9,8,7,6,5,4,3,2,1};
//
此代碼模塊中包含的函數的前向聲明:
ATOM
MyRegisterClass(HINSTANCE
hInstance);
BOOL
InitInstance(HINSTANCE,
int);
LRESULT
CALLBACK
WndProc(HWND,
UINT,
WPARAM,
LPARAM);
LRESULT
CALLBACK
About(HWND,
UINT,
WPARAM,
LPARAM);
int
APIENTRY
_tWinMain(HINSTANCE
hInstance,
HINSTANCE
hPrevInstance,
LPTSTR
lpCmdLine,
int
nCmdShow)
{
//
TODO:
在此放置代碼。
MSG
msg;
HACCEL
hAccelTable;
//
初始化全局字元串
LoadString(hInstance,
IDS_APP_TITLE,
szTitle,
MAX_LOADSTRING);
LoadString(hInstance,
IDC_MY,
szWindowClass,
MAX_LOADSTRING);
MyRegisterClass(hInstance);
//
執行應用程序初始化:
if
(!InitInstance
(hInstance,
nCmdShow))
{
return
FALSE;
}
hAccelTable
=
LoadAccelerators(hInstance,
(LPCTSTR)IDC_MY);
//
主消息循環:
while
(GetMessage(&msg,
NULL,
0,
0))
{
if
(!TranslateAccelerator(msg.hwnd,
hAccelTable,
&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return
(int)
msg.wParam;
}
//
//
函數:
MyRegisterClass()
//
//
目的:
注冊窗口類。
//
//
注釋:
//
//
僅當希望在已添加到
Windows
95
的
//
「RegisterClassEx」函數之前此代碼與
Win32
系統兼容時,
//
才需要此函數及其用法。調用此函數
//
十分重要,這樣應用程序就可以獲得關聯的
//
「格式正確的」小圖標。
//
ATOM
MyRegisterClass(HINSTANCE
hInstance)
{
WNDCLASSEX
wcex;
wcex.cbSize
=
sizeof(WNDCLASSEX);
wcex.style
=
CS_HREDRAW
|
CS_VREDRAW;
wcex.lpfnWndProc
=
(WNDPROC)WndProc;
wcex.cbClsExtra
=
0;
wcex.cbWndExtra
=
0;
wcex.hInstance
=
hInstance;
wcex.hIcon
=
LoadIcon(hInstance,
(LPCTSTR)IDI_MY);
wcex.hCursor
=
LoadCursor(NULL,
IDC_ARROW);
wcex.hbrBackground
=
(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName
=
(LPCTSTR)IDC_MY;
wcex.lpszClassName
=
szWindowClass;
wcex.hIconSm
=
LoadIcon(wcex.hInstance,
(LPCTSTR)IDI_SMALL);
return
RegisterClassEx(&wcex);
}
//
//
函數:
InitInstance(HANDLE,
int)
//
//
目的:
保存實例句柄並創建主窗口
//
//
注釋:
//
//
在此函數中,我們在全局變數中保存實例句柄並
//
創建和顯示主程序窗口。
//
BOOL
InitInstance(HINSTANCE
hInstance,
int
nCmdShow)
{
HWND
hWnd;
hInst
=
hInstance;
//
將實例句柄存儲在全局變數中
hWnd
=
CreateWindow(szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);
if
(!hWnd)
{
return
FALSE;
}
ShowWindow(hWnd,
nCmdShow);
UpdateWindow(hWnd);
return
TRUE;
}
void
LoadingImage(HDC
hdc)
{
HBITMAP
hBmp
=
(HBITMAP)LoadImage(NULL,"00.bmp",IMAGE_BITMAP,300,300,LR_LOADFROMFILE
);
hdcBmp
=
CreateCompatibleDC(hdc);
DeleteObject(SelectObject(hdcBmp,hBmp));
}
void
DrawBmp(HDC
hdc)
{
for(int
i=0;i<3;i++)
for(int
j=0;j<3;j++)
BitBlt(hdc,i*100,j*100,100,100,hdcBmp,(bmp[j][i]-1)%3*100,(bmp[j][i]-1)/3*100,SRCCOPY);
}
void
random()
{
int
i,j;
srand((unsigned)time(NULL));
for(i=0;i<3;i++)
for(j=0;j<3;j++)
while(true)
{
int
t=rand()%9;
if
(num[t])
{
bmp[j][i]=num[t];
num[t]=0;
break;
}
}
}
//
//
函數:
WndProc(HWND,
unsigned,
WORD,
LONG)
//
//
目的:
處理主窗口的消息。
//
//
WM_COMMAND
-
處理應用程序菜單
//
WM_PAINT
-
繪制主窗口
//
WM_DESTROY
-
發送退出消息並返回
//
//
LRESULT
CALLBACK
WndProc(HWND
hWnd,
UINT
message,
WPARAM
wParam,
LPARAM
lParam)
{
int
wmId,
wmEvent,i,j,x,y,t;
PAINTSTRUCT
ps;
HDC
hdc;
//HBITMAP
hBmp;
switch
(message)
{
case
WM_CREATE:
random();
hdc
=
GetDC(hWnd);
LoadingImage(hdc);
ReleaseDC(hWnd,hdc);
break;
case
WM_LBUTTONDOWN:
x
=LOWORD(lParam)/100;
y
=HIWORD(lParam)/100;
if
(old.x==-1)
{
old.x=y;
old.y=x;
}
else
{
t=bmp[old.x][old.y];
bmp[old.x][old.y]
=
bmp[y][x];
bmp[y][x]
=
t;
old.x=-1;
old.y=-1;
}
hdc=GetDC(hWnd);
DrawBmp(hdc);
ReleaseDC(hWnd,hdc);
break;
case
WM_COMMAND:
wmId
=
LOWORD(wParam);
wmEvent
=
HIWORD(wParam);
//
分析菜單選擇:
switch
(wmId)
{
case
IDM_ABOUT:
DialogBox(hInst,
(LPCTSTR)IDD_ABOUTBOX,
hWnd,
(DLGPROC)About);
break;
case
IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return
DefWindowProc(hWnd,
message,
wParam,
lParam);
}
break;
case
WM_PAINT:
hdc
=
BeginPaint(hWnd,
&ps);
//
TODO:
在此添加任意繪圖代碼...
DrawBmp(hdc);
EndPaint(hWnd,
&ps);
break;
case
WM_DESTROY:
PostQuitMessage(0);
break;
default:
return
DefWindowProc(hWnd,
message,
wParam,
lParam);
}
return
0;
}
//
「關於」框的消息處理程序。
LRESULT
CALLBACK
About(HWND
hDlg,
UINT
message,
WPARAM
wParam,
LPARAM
lParam)
{
switch
(message)
{
case
WM_INITDIALOG:
return
TRUE;
case
WM_COMMAND:
if
(LOWORD(wParam)
==
IDOK
||
LOWORD(wParam)
==
IDCANCEL)
{
EndDialog(hDlg,
LOWORD(wParam));
return
TRUE;
}
break;
}
return
FALSE;
}
⑼ 介紹點vc的資源
大量相關電子書籍
>>>>中國IT實驗室<<<<
-----------------------------------------------------------
基礎篇
精通Visual C++圖像編程 MFC中文幫助 MFC程序員的WTL指南
VC6從入門到精通-開發者眼中的VC VC6從入門到精通-附錄 MS VC++6.0程序員指南
VC6從入門到精通-基礎篇 VC6從入門到精通-VC與INTERNET Visual C++ 使用指南
Visual C++知識庫 Visual C++ MFC入門教程 Visual C++ 6 參考大全
跟我學 VISUAL C++ 6.0 Visual C++ 6.0語言參考手冊 Visual Lisp開發人員手冊
Visual C++ 從入門到精通 Visual J++ 6.0 WFC 類庫手冊 Visual InterDev 從入門到精通
Visual C++ 6.0用戶開發手冊 VC編程指南 VC++6.0 類庫參考手冊
VC++database編程大全 VC6.0 運行庫參考手冊 Visual C++6.0運行庫參考手冊
VC++6.0模板庫手冊 VC++面向對象入門 VC新手學堂
Visual C++ 6.0預處理器參考手冊 VC5.0開發人員參考手冊 VC6中文版程序員開發指南
Visual J++ 6.0 WFC類庫參考手冊一 VC6 模板庫參考手冊 VC++編程指南
Visual J++ 6.0 WFC類庫參考手冊二 VC6.0 MFC類庫參考手冊 VC6從入門到精通-VC與資料庫管理
MS VC++ 6.0 MFC類庫參考手冊 一 MS VC++ 6.0 MFC類庫參考手冊 二 走進Visual C++
實例篇
Visual C++ 實踐與提高-圖形圖像編程篇 Visual C++ 數字圖像處理 VC-MFC編程實例
Visual C++實踐與提高_環境剖析IDE篇 Visual C++程序設計:基礎與實例分析 Visual C++ 6.0實例
Visual C++課程設計案例精編 Visual C++ 6.0開發與實例 VISUAL C++擴展編程實例
Visual C++6.0高級編程技巧與實例 VC++擴展編程實例 Visual C++編程技巧與範例
戰勝Visual C++必做練習50題 Visual C++6.0編程與實例解析 VC-MFC擴展編程實例
MFC資源大全 精通Visual C++ 6.0 Visual C++程序模塊集錦
Visual C++_Turbo C串口通信編程 Visual C++ 6.0應用編程150例 Visual C++ 6.0實例教程電子教案
教程篇
MFC Windows程序設計 Visual C++網路通信協議分析 VC6.0資料庫編程
Visual C++ 學習教程 Visual_C++_新起點—6.0實用教程 Visual C++ 6-24學時學習教程
Visual C++ 6.0 21天自學教程 VC++網路教程 Visual C++ MFC 簡明教程
VC 資料庫編程三部教學 Visual C++ 6.0 資料庫編程大全 VC新手學堂簡明教程
Visual C++ 6.0 開發寶典 Visual C++ 6.0 教程 Visual C++ 6.0 高級編程
VC++6.0培訓教程 Visual J++ 6.0 即學即用 Visual C++與面向對象程序設計教程
Visual C++6.0高級開發教程 Visual C++.NET 寶典 Visual C++5.0 程序設計
技術與應用
VC++6.0 用戶界面製作技術與應用實例 深入淺出WINDOWS MFC程序設計 Visual C++ 角色扮演游戲程序
Visual C++6.0程序設計提高篇 VC++編程資料 VC++ 函數經典
VC++與Matlab混合編程的快速實現 Visual C++ 5.0易學活用 VISUAL C++ 設計WIN32應用程序
Visual C++入門與應用 Visual C++6.0開發寶典 Visual C++6.0技術內幕
VC++6編程方法 深入VC編程內幕 VC編程經驗總結
用VC++編寫USB介面通信程序 用VC開發CGI 瘋狂VC技巧集
VC6開發寶典 Visual C++經典 Visual C++ 6 輕松進階
VC編程常用捷徑 MFC技術內幕 VC深入編程