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オブジェクトの場合、図面を描くために使用され、以下にコードがあります)

// 	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;
}