Edit

4015 ワード

7月28日にレッスンを整理します.
Edit
既存のクライアントに線とマッピングを描画することで、
同じソリューションで新しいプロジェクトEditを作成し、マッピングを作成して保存し、クライアントから取得する方法を実現します.
まず、同じソリューションでEditプロジェクトを作成し、クライアントと同じようにEditします.cppの設定(メールの読み取り方法をPeek Messageに設定し、GetTickAcount()で0.1秒ごとに1回メール更新を実行)
次に、クライアントが使用するヘッダーをEditに移動する必要があります(行、行マネージャ、鍵マネージャなど、2回の共通部分を実行する必要がないため).簡単な方法で必要なファイルをEditフォルダに移動したり、クライアントとEditが共有するフォルダからタイトルを受信するように設定したりすることができます.
ここで重要なのはLineManagerを修正することです.まずマウスの線引きを実施しましょう.
まず、マウスの座標を取得し、直線を描く必要があります.この機能をUpdate LineManagerで実装します.
void CLine_Manager::Update_LineManager()
{
	POINT pt{}; 
	GetCursorPos(&pt); 
	ScreenToClient(g_hWnd, &pt);
	if (CKey_Manager::Get_Instance()->Key_Down(KEY_LBUTTON))
	{
		m_listLine.emplace_back(CLine::Create(LINEINFO({ float(pt.x), float(pt.y) }, { float(pt.x), float(pt.y) })));
	}
	if (CKey_Manager::Get_Instance()->Key_Pressing(KEY_LBUTTON))
	{
		m_listLine.back()->Set_RightPos({ float(pt.x), float(pt.y) });
	}
	if (CKey_Manager::Get_Instance()->Key_Down(KEY_S))
	{
		SaveData(); 
	}
	if (CKey_Manager::Get_Instance()->Key_Down(KEY_L))
	{
		LoadData();
	}

}
まず座標値を含むptを宣言し、GetCursorPosで座標値を取得し、ScreenToClientでカーソルの座標をクライアントに対する座標に変更します.
次のキーを押すと、現在のマウス座標で直線が作成されます.
m listLineに挿入し、キーを押したときにSet Rightposでその端点を変更します.リストの前の値が変更されるので、backで一番後ろの値を変更できます.
これにより、マウスを使用して直線を作成し、画面に表示できます.
次に、これらの情報をクライアントで使用するため、ストレージとロード機能が必要です.
まず保存を実施します
void CLine_Manager::SaveData()
{
	HANDLE hFile = CreateFile(L"../Data/LineData.dat",// 경로
		GENERIC_WRITE,//쓸것인지 읽을 것인지 
		0, nullptr,// 파일 공유 및 보안 속성이건 건드릴 필요 없음. 
		CREATE_ALWAYS,// 늘 새로 만들겠다. 
		FILE_ATTRIBUTE_NORMAL,//애는 파일 만들때 속성 어떻게 할건지. 그냥 보통. 건드릴 필요 없음. 
		nullptr);// 이건 그냥 널널 

	if (INVALID_HANDLE_VALUE == hFile)
	{
		MessageBox(nullptr, L"나랏말쌈이뒹귁에닳아 사맛디아니할세 살어리 살어리 랏다 청산에 살어리 랏다 이런들 어떠하리 저런들 어떠하리 이몸이 죽고 죽어 일백번 고쳐죽어", L"공부좀하자 애들아...", MB_OK);

		return; 
	}
	
	DWORD dwByte = 0; 
	for (CLine* pLine : m_listLine)
		WriteFile(hFile, pLine->Get_LineInfo(), sizeof(LINEINFO), &dwByte, nullptr);

	CloseHandle(hFile);
	MessageBox(nullptr, L"나랏말쌈이뒹귁에닳아 사맛디아니할세 살어리 살어리 랏다 청산에 살어리 랏다 이런들 어떠하리 저런들 어떠하리 이몸이 죽고 죽어 일백번 고쳐죽어", L"성공성공!!!", MB_OK);
}
以前に学習したファイルI/Oではなく、コントロールスライダとINVALID HANDLE VALUE、メッセージボックス、CloseHandleを使用します.
FILEの代わりにハンドルを使えばいいです
ファイルを作成してハンドルを取得し、INVALID HANDLE VALUEと比較して、ハンドルが正常に読み込まれたかどうかを確認し、メッセージボックス関数を使用してメッセージボックスを画面にサスペンションします.
次の書き込みファイルを使用して、リスト行のすべての行をファイルに保存します.
保存が完了したら、CloseHandleでハンドルを閉じます.
その後、鍵入力が受信されると、更新は鍵マネージャを呼び出して保存します.

これで保存が実現し、以下はインポートです.
void CLine_Manager::LoadData()
{
	HANDLE hFile = CreateFile(L"../Data/LineData.dat",// 경로
		GENERIC_READ,//쓸것인지 읽을 것인지 
		0, nullptr,// 파일 공유 및 보안 속성이건 건드릴 필요 없음. 
		OPEN_EXISTING,// 늘 새로 만들겠다. 
		FILE_ATTRIBUTE_NORMAL,//애는 파일 만들때 속성 어떻게 할건지. 그냥 보통. 건드릴 필요 없음. 
		nullptr);// 이건 그냥 널널 

	if (INVALID_HANDLE_VALUE == hFile)
	{
		MessageBox(nullptr, L"나랏말쌈이뒹귁에닳아 사맛디아니할세 살어리 살어리 랏다 청산에 살어리 랏다 이런들 어떠하리 저런들 어떠하리 이몸이 죽고 죽어 일백번 고쳐죽어", L"공부좀하자 애들아...", MB_OK);

		return;
	}

	DWORD dwByte = 0;

	for (CLine* pLine : m_listLine)
		Safe_Delete(pLine);

	m_listLine.clear(); 
	LINEINFO tLineInfo{}; 
	while (true)
	{
		ReadFile(hFile, &tLineInfo, sizeof(LINEINFO), &dwByte, nullptr);
		if (0 == dwByte)
			break; 

		m_listLine.emplace_back(CLine::Create(tLineInfo)); 
	}

	CloseHandle(hFile);
	MessageBox(nullptr, L"성공!", L"성공성공!!!", MB_OK);
}
読み込みはCreate fileからGENERIC WRITEに置き換えられ、保存時にファイルの末尾が表示されますが、読み込み時にファイルの末尾が分からないため、dwByteを使用してreadFile関数はdwByteパラメータで読み込まれたバイト長(0の場合)を返し、読み込まれていないバイトを表し、すぐにファイルをこれは、すべての人が読んだことを意味するので、ロードを停止してください.
指定した同じ読み込みボタンを押すと、以前保存したマッピングが正常に読み込みされます.

これにより、マッピングの保存とロードが実現されます.
今日の復習はこれで終わります.