Visual Studio C++ 2008/2010 Express EditionでWindowsフォームアプリケーションでwin32apiを使用する。その2
c++ cli Form で ディスプレイ 解像度の変更プログラムを作る
学習内容
1. c++ cli Form でwin32apiを使用
2. ref class 参照クラスの配列を作る
3. 画面 解像度の変更
4. フォームFormにコマンドラインから引数を読み込む
5. デスクトップに引数付きのショートカットを作る
6. 解像度の変更 マルチディスプレイ対応 カスタム解像度対応
7. 解像度の変更をレジスタ登録する
Visual Studio C++ 2008/2010 Express EditionでWindowsフォームアプリケーションではC++/CLIが採用されているので、.NET Frameworkを使用する。
有料版にはMFCが付いているが、無料版にはない。Formアプリケーションにwin32apiを使用することは御法度のようであるが、邪道で使う方法
までプロジェクトでFormアプリケーションを作成、 今回の作成では ref class 参照クラスの配列を作る。フォームFormにコマンドラインから引数を読み込むため、次のデバッグモードで使用する。
プロジェクト プロパティ リンカー コマンドライン
/INCREMENTAL /NOLOGO "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib"

今回作るアプリケーション
デバック モードでは コマンドラインから
resolution_change.exe 1024 768 32 60 で引数を渡すことができる


Microsoft .NET Framework 4 (Web インストーラー) が必要
どうしてもDLLでしかコンパイルできないときは vcredist_x86.exeをインストールが必要
clrとマルチスレッド/MTは併用できない
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=A7B7A05E-6DE6-4D3A-A423-37BF0912DB84
赤字は入力
// disp32form1.cpp : メイン プロジェクト ファイルです。
#include "stdafx.h"
#include "Form1.h"
using namespace disp32form1;
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
// コントロールが作成される前に、Windows XP ビジュアル効果を有効にします
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
// メイン ウィンドウを作成して、実行します
Application::Run(gcnew Form1(args)); //argsを付ける
return 0;
}
stdafx.hの内容
// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。
#pragma once
#include"windows.h"
#include "commctrl.h"
#include <SDKDDKVer.h>
#include "d_data.h"
#include <commctrl.h>
#include <shlobj.h>
// compile with: /clr
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
// マーシャリング用ヘッダ
//http://msdn.microsoft.com/ja-jp/library/bb531313.aspx
#include <msclr/marshal.h>
d_data.cpp
#include "StdAfx.h"
#include "d_data.h"
d_data::d_data(void){
no=-1;
x_data=0;
y_data=0;
perpel=0;
hz=0;
}
d_data.h
#pragma once
ref class d_data
{
public:
d_data(void);
int no;
int x_data;
int y_data;
int perpel;
int hz;
};
disp.h
#pragma once
ref class disp
{
public:
// DEVMODE* dispmode; // ディスプレイモード // ネイティブ・コードのクラス(※ポインタ)
static array<d_data^>^ disp_data; //参照クラスの配列の収納場所を作る
int old_no;
int old_x_data;
int old_y_data;
int old_perpel;
int old_hz;
int disp_end_no;
int pr_sec_flag;
disp(void);
//========================
// PDISPLAY_DEVICE lpDisplayDevice; // ディスプレイデバイス情報を受け取る構造体へのポインタ
LPCTSTR lpszDeviceName; // ディスプレイデバイス NULLはプライマリーになる
//======================-
int disp_device(DWORD iDevNum);
int disp_use(DWORD iDevNum);
void disp_old(void);
int disp_chang(int width_x,int height_y,int perpel, int frequency_hz, DWORD iDevNum,int reg_w);
//bool GetDisplayDeviceName(CAtlStringArray& astrDeviceName);
int disp_no(DWORD iDevNum);
};
disp.cpp
#include "StdAfx.h"
#include "disp.h"
#include "d_data.h"
//=====================
#include <tchar.h> // L _T
disp::disp(void)
{
static DEVMODE dispmode; // デバイス構造体
disp_data = gcnew array<d_data^> (1000); //参照クラスの配列の収納場所を作る
// DWORD dispNO=0;
// lpszDeviceName=disp::disp_device(dispNO);
EnumDisplaySettings( NULL, ENUM_REGISTRY_SETTINGS, &dispmode ); // NULLはプライマリーディスプレイ解像度のレジストリ保存値を求める
// EnumDisplaySettings( lpszDeviceName, ENUM_REGISTRY_SETTINGS, &dispmode ); // ディスプレイ解像度のレジストリ保存値を求める
old_x_data = dispmode.dmPelsWidth;
old_y_data = dispmode.dmPelsHeight;
old_perpel = dispmode.dmBitsPerPel;
old_hz = dispmode.dmDisplayFrequency;
}
int disp::disp_no(DWORD iDevNum){
static DEVMODE dispmode; // デバイス構造体
//============================
DISPLAY_DEVICE dispDevice = {sizeof(dispDevice)}; //http://oshiete.goo.ne.jp/qa/4621536.html
// DWORD iDevNum = 0; // ディスプレイデバイスが 3 つある場合、各インデックスの値は、0、1、2 となります。DWORD iDevNum = 0;
DWORD dwFlags=NULL;
if(!EnumDisplayDevices(0,iDevNum,&dispDevice,0) ){
MessageBox(NULL, TEXT("ディスプレイデバイス取得失敗しました"), TEXT(""), 0);
return 1;
}
else {// MessageBox(NULL, TEXT(dispDevice.DeviceName), TEXT(""), 0); //ディスプレイネームのチェック用
}
//===========================-dispDevice.DeviceName
EnumDisplaySettings( dispDevice.DeviceName, ENUM_REGISTRY_SETTINGS, &dispmode ); // NULLはプライマリーディスプレイ解像度のレジストリ保存値を求める
// EnumDisplaySettings( lpszDeviceName, ENUM_REGISTRY_SETTINGS, &dispmode ); // ディスプレイ解像度のレジストリ保存値を求める
old_x_data = dispmode.dmPelsWidth;
old_y_data = dispmode.dmPelsHeight;
old_perpel = dispmode.dmBitsPerPel;
old_hz = dispmode.dmDisplayFrequency;
return 0;
}
//http://support.microsoft.com/kb/197671/ja
//http://www.atelier-blue.com/program/mdirectx/3d/3d02-05.htm direct3d
//LPCTSTR disp::disp_device(DWORD iDevNum){ // ディスプレイデバイスが 3 つある場合、各インデックスの値は、0、1、2 となります。
int disp::disp_device(DWORD iDevNum){ // ディスプレイデバイスが 3 つある場合、各インデックスの値は、0、1、2 となります。
//static DEVMODE dispmode; // ディスプレイモード
DISPLAY_DEVICE dispDevice = {sizeof(dispDevice)}; //http://oshiete.goo.ne.jp/qa/4621536.html
iDevNum = 0; // ディスプレイデバイスが 3 つある場合、各インデックスの値は、0、1、2 となります。DWORD iDevNum = 0;
//pfnEnumDisplayDrivers(0, nDevNum, &dispDevice, 0);
DWORD dwFlags=NULL;
// if(!EnumDisplayDevices(NULL,iDevNum,&dispDevice,dwFlags) ){
if(!EnumDisplayDevices(0,iDevNum,&dispDevice,0) ){
// lpDisplayDevice.DeviceName;
MessageBox(NULL, TEXT("ディスプレイデバイス取得失敗しました"), TEXT(""), 0);
return -1;//"\\.\DISPLAY1";
}
else { MessageBox(NULL, TEXT(dispDevice.DeviceName), TEXT(""), 0); //ディスプレイネームのチェック用
}
return 0;//dispDevice.DeviceName;
}
int disp::disp_use(DWORD iDevNum)
{
//使用できるディスプレイモードの確認 配列に収納
static DEVMODE dispmode; // ディスプレイモード
int disp_no;
//============================
DISPLAY_DEVICE dispDevice = {sizeof(dispDevice)}; //http://oshiete.goo.ne.jp/qa/4621536.html
// DWORD iDevNum = 0; // ディスプレイデバイスが 3 つある場合、各インデックスの値は、0、1、2 となります。DWORD iDevNum = 0;
DWORD dwFlags=NULL;
if(!EnumDisplayDevices(0,iDevNum,&dispDevice,0) ){
MessageBox(NULL, TEXT("ディスプレイデバイス取得失敗しました"), TEXT(""), 0);
return 1;
}
else {// MessageBox(NULL, TEXT(dispDevice.DeviceName), TEXT(""), 0); //ディスプレイネームのチェック用
}
//===========================-
disp_no = 0;
while( TRUE )
{
//全モードの列挙
// if( !EnumDisplaySettings( lpDisplayDevice->DeviceName, disp_no, &dispmode ) ) break;
// if( !EnumDisplaySettings( NULL, disp_no, &dispmode ) ) break;
if( !EnumDisplaySettings(dispDevice.DeviceName, disp_no, &dispmode ) ) return 0;
// リッチテキストに表示する
disp_data[disp_no]=gcnew d_data; //重要 クラスの配列の中身の確保
disp_data[disp_no]->no = disp_no;
disp_data[disp_no]->x_data =dispmode.dmPelsWidth; // 解像度横サイズ(width x)
disp_data[disp_no]->y_data =dispmode.dmPelsHeight; // 解像度縦サイズ(hight y)
disp_data[disp_no]->perpel =dispmode.dmBitsPerPel; // 1ピクセル当たりのビット数
disp_data[disp_no]->hz =dispmode.dmDisplayFrequency; // リフレッシュ周波数
pr_sec_flag=dispmode.dmDisplayFlags; // プライマリモニタでなければ0イガイ
disp_end_no=disp_no;
disp_no++;
}
return 0;
}
/*
int disp::disp_chang(int width_x,int height_y,int perpel, int frequency_hz){
static DEVMODE dispmode; // デバイス構造体
HDC hdc; // 現在の色解像度を取得するためのデバイスコンテキスト
hdc = GetDC(NULL); // デバイス構造体を初期化する
ZeroMemory(&dispmode,sizeof(dispmode));
dispmode.dmSize = sizeof(dispmode);
dispmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
dispmode.dmBitsPerPel = GetDeviceCaps(hdc,BITSPIXEL);
dispmode.dmPelsWidth = width_x; // 解像度横サイズ(width x)
dispmode.dmPelsHeight =height_y; // 解像度縦サイズ(hight y)
dispmode.dmBitsPerPel=perpel; // 1ピクセル当たりのビット数
dispmode.dmDisplayFrequency =frequency_hz; // リフレッシュ周波数
ReleaseDC(NULL,hdc);
// ディスプレイモードのチック合格なら解像度変更を行う。
if( ChangeDisplaySettings(&dispmode,CDS_TEST) == DISP_CHANGE_SUCCESSFUL ) {
ChangeDisplaySettings(&dispmode,CDS_FULLSCREEN);
return 0;
}
return 1;
}*/
int disp::disp_chang(int width_x,int height_y,int perpel, int frequency_hz, DWORD iDevNum,int reg_w){
static DEVMODE dispmode; // デバイス構造体
//===========================-
DISPLAY_DEVICE dispDevice = {sizeof(dispDevice)}; //http://oshiete.goo.ne.jp/qa/4621536.html
DWORD dwFlags=NULL;
// DWORD iDevNum=0;
// if(!EnumDisplayDevices(NULL,iDevNum,&dispDevice,dwFlags) ){
if(!EnumDisplayDevices(0,iDevNum,&dispDevice,0) ){
// lpDisplayDevice.DeviceName;
MessageBox(NULL, TEXT("ディスプレイデバイス取得失敗しました"), TEXT(""), 0);
return 1;
}
else {// MessageBox(NULL, TEXT(dispDevice.DeviceName), TEXT(""), 0); //ディスプレイネームのチェック用
}
//===========================-
HDC hdc; // 現在の色解像度を取得するためのデバイスコンテキスト
hdc = GetDC(NULL); // デバイス構造体を初期化する
ZeroMemory(&dispmode,sizeof(dispmode));
dispmode.dmSize = sizeof(dispmode);
dispmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
dispmode.dmBitsPerPel = GetDeviceCaps(hdc,BITSPIXEL); //ok
dispmode.dmPelsWidth = width_x; // 解像度横サイズ(width x)ok
dispmode.dmPelsHeight =height_y; // 解像度縦サイズ(hight y)ok
dispmode.dmBitsPerPel=perpel; // 1ピクセル当たりのビット数 ok
dispmode.dmDisplayFrequency =frequency_hz; // リフレッシュ周波数 ok
// dispmode.dmPosition="0x20"; // Windows 98、Windows 2000:マルチモニタ構成でのデバイス位置 &h20 DM_POSITION
ReleaseDC(NULL,hdc);
//拡張
// LPCSTR lpszDeviceName=NULL; //既存のディスプレー lpDisplayDevice->DeviceName
HWND hwnd=NULL;
LPVOID lParam=NULL;
// ディスプレイモードのチック合格なら解像度変更を行う。
/*if( ChangeDisplaySettingsEx(lpszDeviceName,&dispmode,CDS_TEST,lParam) == DISP_CHANGE_SUCCESSFUL ) {
ChangeDisplaySettingsEx(lpszDeviceName,&dispmode,CDS_FULLSCREEN,lParam);*/
/*if( ChangeDisplaySettingsEx(lpDisplayDevice->DeviceName,&dispmode, hwnd,CDS_TEST,lParam) == DISP_CHANGE_SUCCESSFUL ) {
ChangeDisplaySettingsEx(lpDisplayDevice->DeviceName,&dispmode, hwnd,CDS_FULLSCREEN,lParam);*/
/*if( ChangeDisplaySettingsEx(NULL,&dispmode, hwnd,CDS_TEST,lParam) == DISP_CHANGE_SUCCESSFUL ) { //現在のディスプレーに対して
ChangeDisplaySettingsEx(NULL,&dispmode, hwnd,CDS_FULLSCREEN,lParam);//現在のディスプレーに対して*/
if(reg_w==1){
if( ChangeDisplaySettingsEx(dispDevice.DeviceName,&dispmode, hwnd,CDS_TEST,lParam) == DISP_CHANGE_SUCCESSFUL ){ //lpszDeviceNameのディスプレーに対して
ChangeDisplaySettingsEx(dispDevice.DeviceName,&dispmode, hwnd,CDS_UPDATEREGISTRY,lParam);//lpszDeviceNameのディスプレーに対してCDS_UPDATEREGISTRY 設定変更を行い、情報をレジストリに書き込む。
return 0; }
}else{
if( ChangeDisplaySettingsEx(dispDevice.DeviceName,&dispmode, hwnd,CDS_TEST,lParam) == DISP_CHANGE_SUCCESSFUL ) { //lpszDeviceNameのディスプレーに対して
ChangeDisplaySettingsEx(dispDevice.DeviceName,&dispmode, hwnd,CDS_FULLSCREEN,lParam);//lpszDeviceNameのディスプレーに対して CDS_FULLSCREEN 一時的に切り替える。アプリケーション終了後、元の状態に戻される
return 0; }
} //end else
return 1;
}
//http://msdn.microsoft.com/ja-jp/library/cc428310.aspx
//http://msdn.microsoft.com/ja-jp/library/cc428309.aspx
//http://tokovalue.web.infoseek.co.jp/function/ChangeDisplaySettingsEx.htm
//http://msdn.microsoft.com/en-us/library/dd183411(v=vs.85).aspx
void disp::disp_old(void){
static DEVMODE dispmode; // デバイス構造体
HDC hdc; // 現在の色解像度を取得するためのデバイスコンテキスト
hdc = GetDC(NULL); // デバイス構造体を初期化する
ZeroMemory(&dispmode,sizeof(dispmode));
dispmode.dmSize = sizeof(dispmode);
dispmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
dispmode.dmBitsPerPel = GetDeviceCaps(hdc,BITSPIXEL);
dispmode.dmPelsWidth = old_x_data; // 解像度横サイズ(width x)
dispmode.dmPelsHeight =old_y_data; // 解像度縦サイズ(hight y)
dispmode.dmBitsPerPel=old_perpel; // 1ピクセル当たりのビット数
dispmode.dmDisplayFrequency =old_hz; // リフレッシュ周波数
ReleaseDC(NULL,hdc);
HWND hwnd=NULL;
LPVOID lParam=NULL;
// ディスプレイモードのチック合格なら解像度変更を行う。
//if( ChangeDisplaySettings(&dispmode,CDS_TEST) == DISP_CHANGE_SUCCESSFUL ) {
// ChangeDisplaySettings(&dispmode,CDS_FULLSCREEN);}
if( ChangeDisplaySettingsEx(NULL,&dispmode, hwnd,CDS_TEST,lParam) == DISP_CHANGE_SUCCESSFUL ) { //現在のディスプレーに対して
ChangeDisplaySettingsEx(NULL,&dispmode, hwnd,CDS_FULLSCREEN,lParam);}//現在のディスプレーに対して
}
Form1.hの入力
#pragma once
using namespace System::Diagnostics;
using namespace msclr::interop; // msclr
#include "d_data.h"
#include "disp.h"
#include "shortcut.h"
namespace disp32form1 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Form1 の概要
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
// Form1(void)
array<System::String ^> ^Args_data;
Form1(array<System::String ^> ^args)//voiを変更
{
InitializeComponent();
//
//TODO: ここにコンストラクター コードを追加します
Args_data = args; // 追加
//EnableWindow(ListView_GetHeader(reinterpret_cast(this->listView1->Handle.ToInt32())),FALSE);
//
}
protected:
/// <summary>
/// 使用中のリソースをすべてクリーンアップします。
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^ button1;
protected:
private: System::Windows::Forms::ListBox^ listBox1;
private: System::Windows::Forms::TextBox^ textBox2;
private:
/// <summary>
/// 必要なデザイナー変数です。
/// </summary>
System::ComponentModel::Container ^components;
private: System::Windows::Forms::TextBox^ textBox1;
private: System::Windows::Forms::TextBox^ textBox3;
private: System::Windows::Forms::TextBox^ textBox4;
private: System::Windows::Forms::TextBox^ textBox6;
private: System::Windows::Forms::TextBox^ textBox5;
private: System::Windows::Forms::Button^ button3;
private: System::Windows::Forms::Label^ label1;
private: System::Windows::Forms::Label^ label2;
private: System::Windows::Forms::Label^ label3;
private: System::Windows::Forms::Label^ label4;
private: System::Windows::Forms::Label^ label5;
private: System::Windows::Forms::TextBox^ textBox7;
private: System::Windows::Forms::TextBox^ textBox8;
private: System::Windows::Forms::TextBox^ textBox9;
private: System::Windows::Forms::TextBox^ textBox10;
private: System::Windows::Forms::Label^ label6;
private: System::Windows::Forms::Button^ button4;
private: System::Windows::Forms::Label^ label7;
private: System::Windows::Forms::TextBox^ textBox11;
private: System::Windows::Forms::Label^ label8;
private: System::Windows::Forms::TextBox^ textBox12;
private: System::Windows::Forms::Label^ label9;
private: System::Windows::Forms::Button^ button2;
private: System::Windows::Forms::Button^ button5;
//============================================================-
static disp m_disp;
static shortcut shc;
// static DEVMODE dispmode; // デバイス構造体 混合型はサポートされていません
//============================================================-
#pragma region Windows Form Designer generated code
/// <summary>
/// デザイナー サポートに必要なメソッドです。このメソッドの内容を
/// コード エディターで変更しないでください。
/// </summary>
void InitializeComponent(void)
{
this->button1 = (gcnew System::Windows::Forms::Button());
this->listBox1 = (gcnew System::Windows::Forms::ListBox());
this->textBox2 = (gcnew System::Windows::Forms::TextBox());
this->textBox1 = (gcnew System::Windows::Forms::TextBox());
this->textBox3 = (gcnew System::Windows::Forms::TextBox());
this->textBox4 = (gcnew System::Windows::Forms::TextBox());
this->textBox5 = (gcnew System::Windows::Forms::TextBox());
this->textBox6 = (gcnew System::Windows::Forms::TextBox());
this->button3 = (gcnew System::Windows::Forms::Button());
this->label1 = (gcnew System::Windows::Forms::Label());
this->label2 = (gcnew System::Windows::Forms::Label());
this->label3 = (gcnew System::Windows::Forms::Label());
this->label4 = (gcnew System::Windows::Forms::Label());
this->label5 = (gcnew System::Windows::Forms::Label());
this->textBox7 = (gcnew System::Windows::Forms::TextBox());
this->textBox8 = (gcnew System::Windows::Forms::TextBox());
this->textBox9 = (gcnew System::Windows::Forms::TextBox());
this->textBox10 = (gcnew System::Windows::Forms::TextBox());
this->label6 = (gcnew System::Windows::Forms::Label());
this->button4 = (gcnew System::Windows::Forms::Button());
this->label7 = (gcnew System::Windows::Forms::Label());
this->textBox11 = (gcnew System::Windows::Forms::TextBox());
this->label8 = (gcnew System::Windows::Forms::Label());
this->textBox12 = (gcnew System::Windows::Forms::TextBox());
this->label9 = (gcnew System::Windows::Forms::Label());
this->button2 = (gcnew System::Windows::Forms::Button());
this->button5 = (gcnew System::Windows::Forms::Button());
this->SuspendLayout();
//
// button1
//
this->button1->BackColor = System::Drawing::Color::DeepPink;
this->button1->Location = System::Drawing::Point(83, 1);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(82, 23);
this->button1->TabIndex = 0;
this->button1->Text = L"変更";
this->button1->UseVisualStyleBackColor = false;
this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
//
// listBox1
//
this->listBox1->FormattingEnabled = true;
this->listBox1->ItemHeight = 12;
this->listBox1->Location = System::Drawing::Point(12, 115);
this->listBox1->Name = L"listBox1";
this->listBox1->Size = System::Drawing::Size(523, 352);
this->listBox1->TabIndex = 2;
this->listBox1->SelectedIndexChanged += gcnew System::EventHandler(this, &Form1::listBox1_SelectedIndexChanged);
//
// textBox2
//
this->textBox2->Location = System::Drawing::Point(171, 3);
this->textBox2->Name = L"textBox2";
this->textBox2->Size = System::Drawing::Size(193, 19);
this->textBox2->TabIndex = 5;
//
// textBox1
//
this->textBox1->Location = System::Drawing::Point(48, 61);
this->textBox1->Name = L"textBox1";
this->textBox1->Size = System::Drawing::Size(47, 19);
this->textBox1->TabIndex = 6;
//
// textBox3
//
this->textBox3->Location = System::Drawing::Point(152, 59);
this->textBox3->Name = L"textBox3";
this->textBox3->Size = System::Drawing::Size(78, 19);
this->textBox3->TabIndex = 7;
//
// textBox4
//
this->textBox4->Location = System::Drawing::Point(255, 61);
this->textBox4->Name = L"textBox4";
this->textBox4->Size = System::Drawing::Size(69, 19);
this->textBox4->TabIndex = 8;
//
// textBox5
//
this->textBox5->Location = System::Drawing::Point(353, 61);
this->textBox5->Name = L"textBox5";
this->textBox5->Size = System::Drawing::Size(48, 19);
this->textBox5->TabIndex = 9;
//
// textBox6
//
this->textBox6->Location = System::Drawing::Point(467, 63);
this->textBox6->Name = L"textBox6";
this->textBox6->Size = System::Drawing::Size(68, 19);
this->textBox6->TabIndex = 10;
//
// button3
//
this->button3->BackColor = System::Drawing::Color::Chartreuse;
this->button3->Location = System::Drawing::Point(2, 1);
this->button3->Name = L"button3";
this->button3->Size = System::Drawing::Size(75, 23);
this->button3->TabIndex = 11;
this->button3->Text = L"元に戻す";
this->button3->UseVisualStyleBackColor = false;
this->button3->Click += gcnew System::EventHandler(this, &Form1::button3_Click);
//
// label1
//
this->label1->AutoSize = true;
this->label1->Location = System::Drawing::Point(23, 63);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(19, 12);
this->label1->TabIndex = 12;
this->label1->Text = L"No";
//
// label2
//
this->label2->AutoSize = true;
this->label2->Location = System::Drawing::Point(129, 65);
this->label2->Name = L"label2";
this->label2->Size = System::Drawing::Size(17, 12);
this->label2->TabIndex = 13;
this->label2->Text = L"横";
//
// label3
//
this->label3->AutoSize = true;
this->label3->Location = System::Drawing::Point(232, 63);
this->label3->Name = L"label3";
this->label3->Size = System::Drawing::Size(17, 12);
this->label3->TabIndex = 14;
this->label3->Text = L"縦";
//
// label4
//
this->label4->AutoSize = true;
this->label4->Location = System::Drawing::Point(330, 65);
this->label4->Name = L"label4";
this->label4->Size = System::Drawing::Size(17, 12);
this->label4->TabIndex = 15;
this->label4->Text = L"色";
//
// label5
//
this->label5->AutoSize = true;
this->label5->Location = System::Drawing::Point(407, 65);
this->label5->Name = L"label5";
this->label5->Size = System::Drawing::Size(54, 12);
this->label5->TabIndex = 16;
this->label5->Text = L"リフレッシュ";
//
// textBox7
//
this->textBox7->Location = System::Drawing::Point(152, 93);
this->textBox7->Name = L"textBox7";
this->textBox7->Size = System::Drawing::Size(78, 19);
this->textBox7->TabIndex = 17;
//
// textBox8
//
this->textBox8->Location = System::Drawing::Point(255, 93);
this->textBox8->Name = L"textBox8";
this->textBox8->Size = System::Drawing::Size(69, 19);
this->textBox8->TabIndex = 18;
//
// textBox9
//
this->textBox9->Location = System::Drawing::Point(353, 90);
this->textBox9->Name = L"textBox9";
this->textBox9->Size = System::Drawing::Size(48, 19);
this->textBox9->TabIndex = 19;
//
// textBox10
//
this->textBox10->Location = System::Drawing::Point(467, 90);
this->textBox10->Name = L"textBox10";
this->textBox10->Size = System::Drawing::Size(67, 19);
this->textBox10->TabIndex = 20;
//
// label6
//
this->label6->AutoSize = true;
this->label6->Location = System::Drawing::Point(117, 96);
this->label6->Name = L"label6";
this->label6->Size = System::Drawing::Size(29, 12);
this->label6->TabIndex = 21;
this->label6->Text = L"引数";
//
// button4
//
this->button4->BackColor = System::Drawing::Color::MediumPurple;
this->button4->Location = System::Drawing::Point(2, 24);
this->button4->Name = L"button4";
this->button4->Size = System::Drawing::Size(163, 27);
this->button4->TabIndex = 22;
this->button4->Text = L"ディスクトップにショートカットを作る";
this->button4->UseVisualStyleBackColor = false;
this->button4->Click += gcnew System::EventHandler(this, &Form1::button4_Click);
//
// label7
//
this->label7->AutoSize = true;
this->label7->Location = System::Drawing::Point(389, 29);
this->label7->Name = L"label7";
this->label7->Size = System::Drawing::Size(74, 12);
this->label7->TabIndex = 23;
this->label7->Text = L"ディスプレイNo";
//
// textBox11
//
this->textBox11->Location = System::Drawing::Point(470, 28);
this->textBox11->Name = L"textBox11";
this->textBox11->Size = System::Drawing::Size(46, 19);
this->textBox11->TabIndex = 26;
this->textBox11->TextChanged += gcnew System::EventHandler(this, &Form1::textBox11_TextChanged);
//
// label8
//
this->label8->AutoSize = true;
this->label8->Location = System::Drawing::Point(311, 46);
this->label8->Name = L"label8";
this->label8->Size = System::Drawing::Size(167, 12);
this->label8->TabIndex = 25;
this->label8->Text = L"プライマリー0 セカンダリー123..";
//
// textBox12
//
this->textBox12->Location = System::Drawing::Point(278, 24);
this->textBox12->Name = L"textBox12";
this->textBox12->Size = System::Drawing::Size(102, 19);
this->textBox12->TabIndex = 27;
//
// label9
//
this->label9->AutoSize = true;
this->label9->Location = System::Drawing::Point(169, 31);
this->label9->Name = L"label9";
this->label9->Size = System::Drawing::Size(103, 12);
this->label9->TabIndex = 28;
this->label9->Text = L"現在のディスプレーは";
//
// button2
//
this->button2->Location = System::Drawing::Point(381, 1);
this->button2->Name = L"button2";
this->button2->Size = System::Drawing::Size(145, 23);
this->button2->TabIndex = 29;
this->button2->Text = L"ディスプレイNo変更";
this->button2->UseVisualStyleBackColor = true;
this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click_1);
//
// button5
//
this->button5->BackColor = System::Drawing::Color::Crimson;
this->button5->Location = System::Drawing::Point(9, 87);
this->button5->Name = L"button5";
this->button5->Size = System::Drawing::Size(102, 25);
this->button5->TabIndex = 30;
this->button5->Text = L"レジストリ書き込み";
this->button5->UseVisualStyleBackColor = false;
this->button5->Click += gcnew System::EventHandler(this, &Form1::button5_Click);
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->BackColor = System::Drawing::Color::Plum;
this->ClientSize = System::Drawing::Size(550, 479);
this->Controls->Add(this->button5);
this->Controls->Add(this->button2);
this->Controls->Add(this->label9);
this->Controls->Add(this->textBox12);
this->Controls->Add(this->textBox11);
this->Controls->Add(this->label8);
this->Controls->Add(this->label7);
this->Controls->Add(this->button4);
this->Controls->Add(this->label6);
this->Controls->Add(this->textBox10);
this->Controls->Add(this->textBox9);
this->Controls->Add(this->textBox8);
this->Controls->Add(this->textBox7);
this->Controls->Add(this->label5);
this->Controls->Add(this->label4);
this->Controls->Add(this->label3);
this->Controls->Add(this->label2);
this->Controls->Add(this->label1);
this->Controls->Add(this->button3);
this->Controls->Add(this->textBox6);
this->Controls->Add(this->textBox5);
this->Controls->Add(this->textBox4);
this->Controls->Add(this->textBox3);
this->Controls->Add(this->textBox1);
this->Controls->Add(this->textBox2);
this->Controls->Add(this->listBox1);
this->Controls->Add(this->button1);
this->Name = L"Form1";
this->Text = L"画面解像度変更";
this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
this->ResumeLayout(false);
this->PerformLayout();
}
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
// disp m_disp;
int width_x = int::Parse(textBox3->Text); // 解像度横サイズ(width x)
int height_y =int::Parse(textBox4->Text); // 解像度縦サイズ(hight y)
int perpel =int::Parse(textBox5->Text); // 解像度縦サイズ(hight y)
int frequency_hz =int::Parse(textBox6->Text); // リフレッシュ周波数
DWORD prm_sec_no=DWORD::Parse(textBox11->Text);
//==========
String^ text;
text=textBox3->Text+" "+textBox4->Text+" "+textBox5->Text+" "+textBox6->Text;
int flag=0;
int disp_no;
for(disp_no=0;disp_no<=m_disp.disp_end_no;disp_no++){
//フォームへの引数が解像度と適合しているかのチェック
if( m_disp.disp_data[disp_no]->x_data== width_x &&
m_disp.disp_data[disp_no]->y_data== height_y &&
m_disp.disp_data[disp_no]->perpel== perpel &&
m_disp.disp_data[disp_no]->hz==frequency_hz) flag=1;
}//next
//==========-
int y;
if(flag==1){
y=m_disp.disp_chang( width_x, height_y, perpel, frequency_hz, prm_sec_no,0);
if(y==1) MessageBox::Show("解像度変更失敗");
} else{
if (MessageBox::Show(text+"対応していない解像度です。強制変更してみますか?", "確認", MessageBoxButtons::YesNo) == System::Windows::Forms::DialogResult::Yes) {
y=m_disp.disp_chang( width_x, height_y, perpel, frequency_hz, prm_sec_no,0);
if(y==1) MessageBox::Show("解像度変更失敗");
}
}//end else
}
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
//フォームへの引数の引き渡し 横 縦 色 リフレッシュ 例1028 768 32 60
int h_data0;
int h_data1;
int h_data2;
int h_data3;
int h_data4;
/*======================================
if(0 < CommandLineArgs->Length)
{ System::Diagnostics::Debug::WriteLine("引数の個数 = " + CommandLineArgs->Length);
for(int i = 0;i < CommandLineArgs->Length;i++)System::Diagnostics::Debug::WriteLine("No." + i + " = " + CommandLineArgs[i]);
}else
{ CommandLineArgs = gcnew array<String ^>(2);
CommandLineArgs[0] = "";
}
{ MessageBox::Show("引数の個数 = " + CommandLineArgs->Length);
for(int i = 0;i < CommandLineArgs->Length;i++) MessageBox::Show("No." + i + " = " + CommandLineArgs[i]);
}else
{ CommandLineArgs = gcnew array<String ^>(2);
CommandLineArgs[0] = "";
}
//==========================*/
if(Args_data->Length==5){
h_data0=int::Parse(Args_data[0]);
h_data1=int::Parse(Args_data[1]);
h_data2=int::Parse(Args_data[2]);
h_data3=int::Parse(Args_data[3]);
h_data4=int::Parse(Args_data[4]);
}else{ Args_data = gcnew array<String ^>(2);
Args_data[0] = "";
h_data0=0;
}
if( h_data1>1900*2 || h_data2>1200*2 || h_data3>32 || h_data4>240) { //1900*2 1200*2 以上はエラーとする
h_data0=0;
h_data1=0;
h_data2=0;
h_data3=0;
h_data4=0;
}
//フォームへの引数の引き渡し終わり
//disp m_disp;
//現在のモード
textBox3->Text=m_disp.old_x_data.ToString();
textBox4->Text=m_disp.old_y_data.ToString();
textBox5->Text=m_disp.old_perpel.ToString();
textBox6->Text=m_disp.old_hz.ToString();
//引数
textBox7->Text=h_data1.ToString();
textBox8->Text=h_data2.ToString();
textBox9->Text=h_data3.ToString();
textBox10->Text=h_data4.ToString();
textBox11->Text=h_data0.ToString();
//static DEVMODE dispmode; // デバイス構造体
//使用できるディスプレイモードの確認
DWORD prm_sec_no=DWORD::Parse(textBox11->Text);
int yet;
//レジストリより戻せるデータを読む
yet=m_disp.disp_no(prm_sec_no);
if(yet>0) MessageBox::Show("レジストリ読み込みに失敗しました。");
yet=m_disp.disp_use(prm_sec_no);
if(yet>0) MessageBox::Show("解像度取得に失敗しました。");
String^ text;
text="";
int disp_no=0;
if(m_disp.pr_sec_flag==0) textBox12->Text="プライマリー";
else textBox12->Text="セカンダリ";
/*-------------------
richTextBox1->SaveFile("C:\\dispmode.rtf"); 保存する場合
richTextBox1->LoadFile("C:\\dispmode.rtf");
-------------------*/
// 使用できるディスプレイモードをリストボックスに表示
int flag=0;
if(h_data0==0 && h_data1==0 && h_data2==0 && h_data3==0 && h_data4==0) flag=-1;
int y;
//while( TRUE )
// while(m_disp.disp_data[disp_no]->no = -1)
for(disp_no=0;disp_no<=m_disp.disp_end_no;disp_no++)
{
//全モードの列挙
//if( m_disp.disp_data[disp_no]->no==-1 ) break;
// リッチテキストに表示する
text=disp_no.ToString()+" "+m_disp.disp_data[disp_no]->x_data.ToString()+" "+m_disp.disp_data[disp_no]->y_data.ToString()+
" "+m_disp.disp_data[disp_no]->perpel.ToString()+" "+m_disp.disp_data[disp_no]->hz.ToString()+"\n";
listBox1->Items->Add(text);
//フォームへの引数が解像度と適合しているかのチェック
if( m_disp.disp_data[disp_no]->x_data==h_data1 &&
m_disp.disp_data[disp_no]->y_data==h_data2 &&
m_disp.disp_data[disp_no]->perpel==h_data3 &&
m_disp.disp_data[disp_no]->hz==h_data4) flag=1;
// disp_no++;
}
//textBox1->Text=flag.ToString();
//フォームへの引数の引き渡しがあったときの処理
if(flag==1){
y=m_disp.disp_chang( h_data1,h_data2,h_data3,h_data4,prm_sec_no,0); //フォームへの引数で解像度変更
this->WindowState = FormWindowState::Minimized; //現在のフォームを最小化
MessageBox::Show("現在のフォームを最小化しました。");
}
else {
if(flag !=-1){
text= h_data0.ToString()+" "+h_data1.ToString()+" "+h_data2.ToString()+" "+h_data3.ToString()+" ";
if (MessageBox::Show(text+"対応していない解像度です。強制変更してみますか?", "確認", MessageBoxButtons::YesNo) == System::Windows::Forms::DialogResult::Yes) {
y=m_disp.disp_chang( h_data1,h_data2,h_data3,h_data4,prm_sec_no,0);
}
}
}
if(y==1) MessageBox::Show("解像度変更失敗");
/*
現在のフォームを最小化
this->WindowState = FormWindowState::Minimized;
現在のフォームを最大化
this->WindowState = FormWindowState::Maximized;
現在のフォームを最小化、あるいは最大化から元に戻す
this->WindowState = FormWindowState::Normal;
現在のフォームを非表示
this->Hide();
現在のフォームを非表示から表示
this->Show();
*/
}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
// disp m_disp;
int s_no=0;
textBox2->Text=listBox1->Text;
textBox1->Text=listBox1->SelectedIndex.ToString();
s_no=listBox1->SelectedIndex;
textBox3->Text=m_disp.disp_data[s_no]->x_data.ToString();
textBox4->Text=m_disp.disp_data[s_no]->y_data.ToString();
textBox5->Text=m_disp.disp_data[s_no]->perpel.ToString();
textBox6->Text=m_disp.disp_data[s_no]->hz.ToString();
}
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
m_disp.disp_old();
}
private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {
//http://code.msdn.microsoft.com/VisualC-7c6bc862
//http://yokohama.cool.ne.jp/chokuto/urawaza/com/shell.html
//http://minidx.blogspot.com/2007/03/vc_14.html 文字ニツイテ
//http://fatalita.sakura.ne.jp/Junk/_T/index.html
//const TCHAR * text = _T("文字列"); と LPCTSTR text = _T("文字列"); は同じ意味です。
//http://ysmt.blog21.fc2.com/blog-entry-244.html
//http://support.microsoft.com/kb/311259/ja
//http://codezine.jp/article/detail/4774
shortcut stc;
int ret;
String^ option1;
String^ option2;
option1= textBox11->Text + " "+textBox3->Text + " "+ textBox4->Text + " " + textBox5->Text + " " + textBox6->Text;
option2="\\resolution_change "+option1+".lnk";
MessageBox::Show(option1+"解像度の準備をします");
//LPTSTR pszStr; //exeample ="1024 768 32 60";
const char* pszStr1;
marshal_context ctx1;
pszStr1 = ctx1.marshal_as<const char*>(option1);
const char* pszStr2;
marshal_context ctx2;
pszStr2 = ctx2.marshal_as<const char*>(option2);
// s2 = ctx.marshal_as<const wchar_t*>(s0);
ret=stc.Stcut(pszStr1,pszStr2);
if(ret) MessageBox::Show("デスクトップのショートカットを確認してください");
}
private: System::Void listBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {
// disp m_disp;
int s_no=0;
textBox2->Text=listBox1->Text;
textBox1->Text=listBox1->SelectedIndex.ToString();
s_no=listBox1->SelectedIndex;
textBox3->Text=m_disp.disp_data[s_no]->x_data.ToString();
textBox4->Text=m_disp.disp_data[s_no]->y_data.ToString();
textBox5->Text=m_disp.disp_data[s_no]->perpel.ToString();
textBox6->Text=m_disp.disp_data[s_no]->hz.ToString();
}
private: System::Void textBox11_TextChanged(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void button2_Click_1(System::Object^ sender, System::EventArgs^ e) {
//static DEVMODE dispmode; // デバイス構造体
int yet;
DWORD prm_sec_no;
prm_sec_no=DWORD::Parse(textBox11->Text);
yet=m_disp.disp_device(prm_sec_no);
if (yet==-1) {
textBox11->Text="0";
MessageBox::Show("このNoのディスプレーは存在しません"); }
prm_sec_no=DWORD::Parse(textBox11->Text);
//レジストリより戻せるデータを読む
yet=m_disp.disp_no(prm_sec_no);
if(yet>0) MessageBox::Show("レジストリ読み込みに失敗しました。");
//使用できるディスプレイモードの確認
yet=m_disp.disp_use(prm_sec_no);
if(yet>0) MessageBox::Show("解像度取得に失敗しました。");
String^ text;
text="";
if(m_disp.pr_sec_flag==0) textBox12->Text="プライマリー";
else textBox12->Text="セカンダリ";
// 使用できるディスプレイモードをリストボックスに表示
listBox1->Items->Clear();
for(int disp_no=0;disp_no<=m_disp.disp_end_no;disp_no++){
//全モードの列挙
// リッチテキストに表示する
text=disp_no.ToString()+" "+m_disp.disp_data[disp_no]->x_data.ToString()+" "+m_disp.disp_data[disp_no]->y_data.ToString()+
" "+m_disp.disp_data[disp_no]->perpel.ToString()+" "+m_disp.disp_data[disp_no]->hz.ToString()+"\n";
listBox1->Items->Add(text);
}
}
private: System::Void button5_Click(System::Object^ sender, System::EventArgs^ e) {
// disp m_disp;
if(MessageBox::Show("解像度変更後 レジストリに書き込みを行いますか?","レジストリに書き込み危険",
MessageBoxButtons::YesNo) == System::Windows::Forms::DialogResult::Yes) {
// disp m_disp;
int width_x = int::Parse(textBox3->Text); // 解像度横サイズ(width x)
int height_y =int::Parse(textBox4->Text); // 解像度縦サイズ(hight y)
int perpel =int::Parse(textBox5->Text); // 解像度縦サイズ(hight y)
int frequency_hz =int::Parse(textBox6->Text); // リフレッシュ周波数
DWORD prm_sec_no=DWORD::Parse(textBox11->Text);
//==========
String^ text;
text=textBox3->Text+" "+textBox4->Text+" "+textBox5->Text+" "+textBox6->Text;
int disp_no;
int flag=0;
for(disp_no=0;disp_no<=m_disp.disp_end_no;disp_no++){
//フォームへの引数が解像度と適合しているかのチェック
if( m_disp.disp_data[disp_no]->x_data== width_x &&
m_disp.disp_data[disp_no]->y_data== height_y &&
m_disp.disp_data[disp_no]->perpel== perpel &&
m_disp.disp_data[disp_no]->hz==frequency_hz) flag=1;
} //next
//==========-
int y;
if(flag==1){ y=m_disp.disp_chang( width_x, height_y, perpel, frequency_hz, prm_sec_no,1);
if(y==1) MessageBox::Show("解像度変更失敗");
} else{ if (MessageBox::Show(text+"対応していない解像度です。強制変更してみますか?", "確認", MessageBoxButtons::YesNo) == System::Windows::Forms::DialogResult::Yes) {
y=m_disp.disp_chang( width_x, height_y, perpel, frequency_hz, prm_sec_no,1);
if(y==1) MessageBox::Show("解像度変更失敗");
} //end if MB
}
} //end button5
}
};
}



