MFC学習ノート
このノートは「孫鑫MFC教程」を見たときに書いたもので、彼はVC 6を使っています.0ですが、Win 7とVC 6です.0互換性がない場合、私自身がVS 2008でやったいくつかの例と練習があります.
ウィンドウ作成プロセス
1.ウィンドウクラスを設計する;2.ウィンドウクラスを登録する.3.ウィンドウを作成する;4.ウィンドウの表示と更新
Testという名前のMFCプログラム
システムのデフォルトでは、CAboutDlg(継承)、CMainFrame(継承CframeWnd)、CTestApp(継承CWinApp)、CTestDoc(継承CDocument)、CTestView(継承CView)の5つのクラスが生成されます.
メッセージ応答関数を追加すると、3つの場所にコードが追加されます.
1.自分で追加したメッセージ応答関数コード2.対応するヘッダファイル、DECLARE_MESSAGE_MAP()関数の前に、マクロの宣言が自動的に追加されます.対応するソースファイルで、BEGIN_MESSAGE_MAP(CDrawView, CView) END_MESSAGE_MAP()の間には、対応するマクロの宣言もあります
m_hWnd
これはMFC下位クラスライブラリから派生したデータメンバーであり,クラスで直接使用できる.例えば、HDC hdc;hdc =::GetDC(m_hWnd);::ReleaseDC(m_hWnd, hdc);
DC(DeviceContextオブジェクトの場合、図面を描くために使用され、以下にコードがあります)
独自に作成したmodal()タイプのダイアログボックスには、3つのメモとボタンがあります.3つの整数データが関連付けられています.加算機能を実現します.
ダイアログのサイズを手動で変更する
反発量の使用
ウィンドウ作成プロセス
1.ウィンドウクラスを設計する;2.ウィンドウクラスを登録する.3.ウィンドウを作成する;4.ウィンドウの表示と更新
Testという名前のMFCプログラム
システムのデフォルトでは、CAboutDlg(継承)、CMainFrame(継承CframeWnd)、CTestApp(継承CWinApp)、CTestDoc(継承CDocument)、CTestView(継承CView)の5つのクラスが生成されます.
メッセージ応答関数を追加すると、3つの場所にコードが追加されます.
1.自分で追加したメッセージ応答関数コード2.対応するヘッダファイル、DECLARE_MESSAGE_MAP()関数の前に、マクロの宣言が自動的に追加されます.対応するソースファイルで、BEGIN_MESSAGE_MAP(CDrawView, CView) END_MESSAGE_MAP()の間には、対応するマクロの宣言もあります
m_hWnd
これはMFC下位クラスライブラリから派生したデータメンバーであり,クラスで直接使用できる.例えば、HDC hdc;hdc =::GetDC(m_hWnd);::ReleaseDC(m_hWnd, hdc);
DC(DeviceContextオブジェクトの場合、図面を描くために使用され、以下にコードがあります)
// CDC *pDC = GetDC();
// pDC->MoveTo(m_ptOrigin);
// pDC->LineTo(m_ptEnd);
// ReleaseDC(pDC);
// CClientDC dc(this);
// dc.MoveTo(m_ptOrigin);
// dc.LineTo(m_ptEnd);
dc(GetDesktopWindow());
// dc.MoveTo(m_ptOrigin);
// dc.LineTo(m_ptEnd);
独自に作成したmodal()タイプのダイアログボックスには、3つのメモとボタンがあります.3つの整数データが関連付けられています.加算機能を実現します.
//int num1, num2, num3;
//CString str1, str2, str3;
//GetDlgItem(IDC_EDIT1)->GetWindowText(str1);
//GetDlgItem(IDC_EDIT2)->GetWindowText(str2);
//num1=_ttoi((LPCTSTR)str1);
//num2=_ttoi((LPCTSTR)str2);
//num3=num1+num2;
//_itot(num3,(TCHAR*)str3.GetBuffer(10),10);
//str3.ReleaseBuffer();
//GetDlgItem(IDC_EDIT3)->SetWindowText(str3);// num1+num2
//GetDlgItemText(IDC_EDIT1, str1);
//GetDlgItemText(IDC_EDIT2, str2);
//num1=_ttoi((LPCTSTR)str1);
//num2=_ttoi((LPCTSTR)str2);
//num3=num1+num2;
//_itot(num3,(TCHAR*)str3.GetBuffer(10),10);
//str3.ReleaseBuffer();
//SetDlgItemText(IDC_EDIT3, str3);
/*num1 = GetDlgItemInt(IDC_EDIT1);
num2 = GetDlgItemInt(IDC_EDIT2);
num3 = num1 + num2;
SetDlgItemInt(IDC_EDIT3, num3);*/
/*UpdateData();
m_num3 = m_num1 + m_num2;
UpdateData(false);*/
//m_edit1.GetWindowText(str1);
//m_edit2.GetWindowText(str2);
//num1=_ttoi((LPCTSTR)str1);
//num2=_ttoi((LPCTSTR)str2);
//num3=num1+num2;
//_itot(num3,(TCHAR*)str3.GetBuffer(10),10);
//str3.ReleaseBuffer();
//m_edit3.SetWindowText(str3);// num1+num2
ダイアログのサイズを手動で変更する
// TODO:
CString str;
GetDlgItemText(ID_SHOUSUO, str);
if (str == " <<")
{
SetDlgItemText(ID_SHOUSUO, L" >>");
}
else
{
SetDlgItemText(ID_SHOUSUO, L" <<");
}
static CRect rectLarge;
static CRect rectSmall;
if (rectLarge.IsRectNull())
{
CRect rectSeparator;
GetWindowRect(&rectLarge);
GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator);
rectSmall.top = rectLarge.top;
rectSmall.left = rectLarge.left;
rectSmall.bottom = rectLarge.bottom;
rectSmall.right = rectSeparator.right;
}
if (str == " <<")
{
SetWindowPos(NULL, 0, 0, rectSmall.Width(), rectSmall.Height(), SWP_NOZORDER | SWP_NOMOVE);
}
else
{
SetWindowPos(NULL, 0, 0, rectLarge.Width(), rectLarge.Height(), SWP_NOZORDER | SWP_NOMOVE);
}
反発量の使用
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
);
DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
);
int index=0;
int tickets=100;
HANDLE hMutex;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
/*while(index++<1000)
cout<<"main thread is running"<<endl;*/
//hMutex=CreateMutex(NULL,TRUE,NULL);
hMutex=CreateMutex(NULL,TRUE,"tickets");
if(hMutex)
{
if(ERROR_ALREADY_EXISTS==GetLastError())
{
cout<<"only instance can run!"<<endl;
return;
}
}
WaitForSingleObject(hMutex,INFINITE);
ReleaseMutex(hMutex);
ReleaseMutex(hMutex);
Sleep(4000);
// Sleep(10);
}
DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
)
{
/*while(index++<1000)
cout<<"thread1 is running"<<endl;*/
/*while(TRUE)
{
//ReleaseMutex(hMutex);
WaitForSingleObject(hMutex,INFINITE);
if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;
ReleaseMutex(hMutex);
}*/
WaitForSingleObject(hMutex,INFINITE);
cout<<"thread1 is running"<<endl;
return 0;
}
DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
)
{
/*while(TRUE)
{
//ReleaseMutex(hMutex);
WaitForSingleObject(hMutex,INFINITE);
if(tickets>0)
{
Sleep(1);
cout<<"thread2 sell ticket : "<<tickets--<<endl;
}
else
break;
ReleaseMutex(hMutex);
}*/
WaitForSingleObject(hMutex,INFINITE);
cout<<"thread2 is running"<<endl;
return 0;
}