FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

今日は、ぼやく。And SourceCode AnkiTyping

ポーカーソフト製作中止しますた。

Q、なんでやねん!?

A、別のソフト作ってるからです。

Q、なんや”別のソフト”って?

A、私用目的の"DVD・CD管理ソフト"と公開目的の"データ転送ソフト"です。

Q、ちなみにできたのか?

A、私用目的の方は汚いけど使えるレベルまで出来た。
  データ転送ソフトは、この記事書く前まで作ってたが、全く出来てない。
  けど頭が回らんので明日以降に続きをやるつもり。

ホントに頭回らない日です。
いつもコーヒーを一杯飲んでから始めるのが習慣なんですが、今日はコーヒー飲んでない。
・・・眠いだけなのかもしれない。
というわけで、続きには暗記Typingのソース大公開!
超見にくい上に、コードが汚いorz

追記:includeファイル見えてなかったから直しました。4/1 12:52

//typing.cpp

#define ID_EDIT 100
#define ID_EDIT2 101
#define WIN32_LEAN_AND_MEAN

#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<windowsx.h>
#include"resource.h"
#pragma comment(linker,"/manifestdependency:\"type='win32' \
name='Microsoft.Windows.Common-Controls' \
version='6.0.0.0' \
processorArchitecture='x86' \
publicKeyToken='6595b64144ccf1df' \
language='*'\"")

LPCTSTR szClassName=TEXT("Typing"),lpFileName=TEXT("KEYWORD.txt");
TCHAR buf[512],szTstr[256],strPath[MAX_PATH],word[512];
HINSTANCE hInst;
WNDPROC OldProc;
HWND hwnd,hEdit0,hEdit1,hEdit2;
static int len[256],nLen2,check[256];
int nword,nMondai,radio=0;
time_t t1,t2;//開始&終了時間格納
LPTSTR lpBuf;//動的メモリ
HANDLE hFile;//ファイルハンドル
HGLOBAL hMem;
DWORD nRead,nWrite,fSize;//読んだサイズ,書いたサイズ,ファイルサイズ

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK MyEditProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK MyDlgProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK MyDlgProc2(HWND,UINT,WPARAM,LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE,int);
int _rand(int,int);//乱数の自作関数
void myRead(void);//ファイルからキーワードを読み込む"移植性の無い"自作関数

int WINAPI WinMain(HINSTANCE hCurInst,HINSTANCE hPrevInst,
LPSTR lpsCmdLine,int nCmdShow)
{
MSG msg;
BOOL bRet;

if(!InitApp(hCurInst))
return FALSE;
if(!InitInstance(hCurInst,nCmdShow))
return FALSE;
while((bRet=GetMessage(&msg,NULL,0,0))!=0){
if(bRet==-1){
MessageBox(NULL,TEXT("GetMessageERROR"),TEXT("ERROR"),MB_OK);
break;
}else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}

ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInst;
wc.hIcon=(HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,0,0,
LR_DEFAULTSIZE|LR_SHARED);
wc.hCursor=(HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,0,0,
LR_DEFAULTSIZE|LR_SHARED);
wc.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
wc.lpszMenuName=TEXT("MYMENU");
wc.lpszClassName=szClassName;
wc.hIconSm=(HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE|LR_SHARED);

return (RegisterClassEx(&wc));
}

BOOL InitInstance(HINSTANCE hInst,int nCmdShow)
{
HWND hWnd;

hwnd=hWnd=CreateWindow(szClassName,
TEXT("暗記Typing"),
WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
CW_USEDEFAULT,CW_USEDEFAULT,
400,//幅
150,//高さ
NULL,
NULL,
hInst,
NULL);
if(!hWnd)
return FALSE;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp)
{
PAINTSTRUCT ps;
HDC hdc;
LPCTSTR text=TEXT("ESCキーで終了"),SetFile=TEXT("sys.ini");
static int l,i,k;
TCHAR br,cradio[3],szSetFile[MAX_PATH];

switch(msg){
case WM_CREATE:
srand((unsigned int)time(NULL));
hEdit1=CreateWindow(TEXT("EDIT"),TEXT("スペースキーでスタート"),
WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL|ES_READONLY,
/*ES_READONLYリードオンリースタイル*/
10,10,375,25,
hWnd,(HMENU)ID_EDIT,hInst,NULL);
hEdit2=CreateWindow(TEXT("EDIT"),TEXT(""),
WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,
10,50,375,25,
hWnd,(HMENU)ID_EDIT2,hInst,NULL);
SendMessage(hEdit2,EM_SETLIMITTEXT,(WPARAM)511,0);
OldProc=(WNDPROC)SetWindowLongPtr(hEdit2,GWL_WNDPROC,(LONG)MyEditProc);
SetFocus(hWnd);

GetCurrentDirectory(MAX_PATH,strPath);//ディレクトリパス取得
wsprintf(strPath,TEXT("%s\\%s"),strPath,lpFileName);//lpFileNameを追記

hFile=CreateFile(strPath,
GENERIC_READ,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile==INVALID_HANDLE_VALUE){
MessageBox(hWnd,TEXT("FileOpenERROR"),TEXT("ERROR"),MB_OK);
break;
}
/**************************改行位置格納処理*/
SetFilePointer(hFile,0,0,FILE_BEGIN);
do{
l=ReadFile(hFile,&br,sizeof(TCHAR),&nRead,NULL);//TCHAR分読む→brへ
if(l==0){
MessageBox(hWnd,TEXT("ReadFileERROR!"),TEXT("EROOR"),MB_OK);
break;
}else if(l!=0 && nRead==0){
break;
}
i++;
if(br==TEXT('\n')){//もしbrが'\n'なら
k++;
len[k]=i-2;//文字列終端位置情報格納
//i=0;//←有効ならば文字数
}
}while(1);

l=0;
do{
l++;
}while(len[l]>=1);
nword=l-1;
if(nword==0){
MessageBox(hWnd,TEXT("キーワードがありません\nキーワードを登録して下さい"),
TEXT("NoKeyWord"),MB_OK);
CloseHandle(hFile);
SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_K,0),0);
}else{
/****************************/
CloseHandle(hFile);
}
GetCurrentDirectory(MAX_PATH,szSetFile);//ディレクトリパス取得
wsprintf(szSetFile,TEXT("%s\\%s"),szSetFile,SetFile);//lpFileNameを追記
GetPrivateProfileString(TEXT("RADIOSET"),TEXT("radio"),TEXT("0"),cradio,sizeof(cradio),szSetFile);//設定読み込み
radio=atoi(cradio);//数字←文字変換
break;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
SetBkMode(hdc,TRANSPARENT);
TextOut(hdc,10,80,text,lstrlen(text));
EndPaint(hWnd,&ps);
break;
case WM_CHAR:
if(wp==VK_SPACE){
hFile=CreateFile(strPath,
GENERIC_READ,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile==INVALID_HANDLE_VALUE){
MessageBox(hWnd,TEXT("FileOpenERROR"),TEXT("ERROR"),MB_OK);
break;
}
for(l=0;l<256;l++){
check[l]=0;//チェックフラグ初期化
}
switch(radio){
case 0://ランダム(何度も)
nMondai=_rand(0,nword);
break;
case 1://登録順
nMondai=0;
break;
case 2://ランダム(一度だけ)
nMondai=_rand(0,nword);
check[nMondai]=1;//チェックフラグ
break;
}
myRead();//自作関数
SetWindowText(hEdit1,word);
SetFocus(hEdit2);
t1=time(NULL);//スタート時間格納
}
break;
case WM_COMMAND:
switch(LOWORD(wp)){
case IDM_K:
DialogBox(hInst,TEXT("MYDLG"),hWnd,(DLGPROC)MyDlgProc);//キーワード登録ダイアログ
break;
case IDM_V:
DialogBox(hInst,TEXT("MYDLG2"),hWnd,(DLGPROC)MyDlgProc2);//表示設定ダイアログ
break;
case IDM_END:
SendMessage(hWnd,WM_CLOSE,0,0);//終了メッセージ送信
break;
case IDM_ABOUT:
MessageBox(hWnd,TEXT("暗記Typing Ver.2.01\nCopyright(C)2010 Y.Kudo"),
TEXT("情報"),MB_OK);//バージョン情報
break;
default:
return(DefWindowProc(hWnd,msg,wp,lp));
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd,msg,wp,lp));
}
return 0;
}

LRESULT CALLBACK MyEditProc(HWND hEdit,UINT msg,WPARAM wp,LPARAM lp)//サブクラス化エディットプロシージャ
{
static int nt,F,True;//nt=総タイプ回数,F=ミスタイプ回数,True=正当タイプ回数
static RECT rc;
PAINTSTRUCT ps;
HDC hdc;
LPCTSTR OK=TEXT("OK!"),TRY=TEXT("RETRY");

switch(msg){
case WM_CHAR:
if(wp==VK_RETURN){
rc.left=130;
rc.top=80;
rc.right=200;
rc.bottom=100;
InvalidateRect(hwnd,&rc,TRUE);
nt++;//タイプ回数加算
hdc=BeginPaint(hwnd,&ps);
SetBkMode(hdc,TRANSPARENT);
GetWindowText(hEdit,buf,511);//ユーザー入力取得

if((0==lstrcmp(word,buf))){
wsprintf(buf,TEXT(""));//bufクリア
True++;//正当数
switch(radio){//設定によって動作変更
case 0://ランダム(何度も)
nMondai=_rand(0,nword);//乱数
break;
case 1://登録順
nMondai++;
if(nMondai==nword){
SendMessage(hEdit,WM_CHAR,VK_ESCAPE,0);//終了メッセージ送信
goto BREAK;//使いたく無かったけど便利だ
}
break;
case 2://ランダム(一度のみ)
if(True==nword){//すべて表示したなら
SendMessage(hEdit,WM_CHAR,VK_ESCAPE,0);//終了メッセージ送信
goto BREAK;
}else{
do{
nMondai=_rand(0,nword);
}while(check[nMondai]==1);
check[nMondai]=1;
}
break;
}
myRead();//自作関数
SetWindowText(hEdit1,word);//タイピング文の表示
TextOut(hdc,130,80,OK,lstrlen(OK));
}else{//ミスタイプ処理
TextOut(hdc,150,80,TRY,lstrlen(TRY));
F++;//ミスタイプ回数
}
BREAK:
SetWindowText(hEdit,TEXT(""));//入力エディットコントロールクリア
EndPaint(hwnd,&ps);
break;
}
if(wp==VK_ESCAPE){//エンド処理
t2=time(NULL);//終了時間格納
CloseHandle(hFile);
wsprintf(szTstr,TEXT("タイプ%d回/ミス%d回,時間%d秒"),nt,F,t2-t1);
MessageBox(hwnd,szTstr,TEXT("Message"),MB_OK);//結果出力
nt=0; /* */
F=0; /*カウント初期化*/
True=0;/* */
SetWindowText(hEdit1,TEXT("スペースキーでスタート"));
break;

}
}
return CallWindowProc(OldProc,hEdit,msg,wp,lp);
}

BOOL CALLBACK MyDlgProc(HWND hDlg,UINT msg,WPARAM wp,LPARAM lp)//メッセージ登録ダイアログプロシージャ
{
int nLen;//エディットコントロールの文字数
int n=0,k=0;

switch(msg){
case WM_INITDIALOG:
hEdit0=GetDlgItem(hDlg,IDC_EDIT0);

GetCurrentDirectory(MAX_PATH,strPath);//ディレクトリパス取得
wsprintf(strPath,TEXT("%s\\%s"),strPath,lpFileName);//lpFileNameを追記

hFile=CreateFile(strPath,
GENERIC_READ,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);

if(hFile==INVALID_HANDLE_VALUE){
MessageBox(hDlg,TEXT("FileOpenERROR!\nスタート後キーワードの変更はできません"),TEXT("ERROR"),MB_OK);
EndDialog(hDlg,IDOK);
break;
}

if(0==(fSize=GetFileSize(hFile,NULL))){
MessageBox(hDlg,TEXT("キーワードが登録されていません"),TEXT("NoKeyWord"),MB_OK);
SetWindowText(hEdit0,TEXT(""));
CloseHandle(hFile);
return TRUE;
}
hMem=GlobalAlloc(GHND,fSize+sizeof(TCHAR));
if(NULL==hMem){
MessageBox(hDlg,TEXT("空きメモリ容量が足りません"),
TEXT("ERROR"),MB_ICONEXCLAMATION|MB_OK);
CloseHandle(hFile);
return TRUE;
}
lpBuf=(LPTSTR)GlobalLock(hMem);
ReadFile(hFile,lpBuf,fSize,&nRead,NULL);
lpBuf[nRead]=TEXT('\0');
SetWindowText(hEdit0,lpBuf);
CloseHandle(hFile);
GlobalUnlock(hMem);
GlobalFree(hMem);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wp)){
case IDM_W:
nLen=SendMessage(hEdit0,WM_GETTEXTLENGTH,NULL,NULL);
if(nLen==0){
MessageBox(hDlg,TEXT("キーワードがありません"),TEXT("Message"),MB_OK);
return TRUE;
}
if(IDYES==(MessageBox(hDlg,TEXT("キーワードを書き込みますか?"),
TEXT("確認"),MB_YESNO|MB_ICONQUESTION))){

GetCurrentDirectory(MAX_PATH,strPath);//ディレクトリパス取得
wsprintf(strPath,TEXT("%s\\%s"),strPath,lpFileName);//lpFileNameを追記

hMem=GlobalAlloc(GHND,sizeof(TCHAR)*(nLen+1));
if(NULL==hMem){
MessageBox(hDlg,TEXT("空きメモリ容量が足りません"),
TEXT("ERROR"),MB_ICONEXCLAMATION|MB_OK);
CloseHandle(hFile);
return TRUE;
}

lpBuf=(LPTSTR)GlobalLock(hMem);
GetWindowText(hEdit0,lpBuf,nLen+1);
hFile=CreateFile(strPath,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile==INVALID_HANDLE_VALUE){
MessageBox(hDlg,TEXT("FileOpenERROR"),TEXT("ERROR"),MB_OK);
break;
}
k=WriteFile(hFile,lpBuf,(DWORD)lstrlen(lpBuf),&nWrite,NULL);
if(k==0){
MessageBox(hDlg,TEXT("書き込みエラー"),TEXT("Message"),MB_OK);
CloseHandle(hFile);
GlobalUnlock(hMem);
GlobalFree(hMem);
return TRUE;
}
CloseHandle(hFile);
GlobalUnlock(hMem);
GlobalFree(hMem);
MessageBox(hDlg,TEXT("書き込みました\n暗記Typingを再起動して下さい"),TEXT("Message"),MB_OK);
return TRUE;

}else{
return FALSE;
}
case IDOK:
case IDCANCEL:
EndDialog(hDlg,IDOK);
return TRUE;
}
return FALSE;
}
return FALSE;
}

BOOL CALLBACK MyDlgProc2(HWND hDlg,UINT msg,WPARAM wp,LPARAM lp)//表示設定ダイアログプロシージャ
{
HWND hRadio1,hRadio2,hRadio3;
LPCTSTR SetFile=TEXT("sys.ini");//設定ファイル名
TCHAR cradio[3],szSetFile[MAX_PATH];

switch(msg){
case WM_INITDIALOG:
hRadio1=GetDlgItem(hDlg,IDC_RADIO1);
hRadio2=GetDlgItem(hDlg,IDC_RADIO2);
hRadio3=GetDlgItem(hDlg,IDC_RADIO3);

if(radio==0){
Button_SetCheck(hRadio1,BST_CHECKED);
}else if(radio==1){
Button_SetCheck(hRadio2,BST_CHECKED);
}else{//radio==2
Button_SetCheck(hRadio3,BST_CHECKED);
}
return TRUE;
case WM_COMMAND:
switch(LOWORD(wp)){
case IDCANCEL:
case IDOK:
wsprintf(cradio,TEXT("%d"),radio);//数字を文字に変換
GetCurrentDirectory(MAX_PATH,szSetFile);//ディレクトリパス取得
wsprintf(szSetFile,TEXT("%s\\%s"),szSetFile,SetFile);//lpFileNameを追記
WritePrivateProfileString(TEXT("RADIOSET"),TEXT("radio"),cradio,szSetFile);//設定保存
EndDialog(hDlg,IDOK);
return TRUE;
case IDC_RADIO1:
radio=0;
return TRUE;
case IDC_RADIO2:
radio=1;
return TRUE;
case IDC_RADIO3:
radio=2;
return TRUE;
}
return FALSE;
}
return FALSE;
}

int _rand(int min,int max)
{
/*static int flag;

if(flag==0){
srand((unsigned int)time(NULL));
flag=1;
}/*WM_CREATEメッセージで処理*/
return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}

void myRead(void)
{
/************************文字列読み込み*/
if(nMondai==0){
SetFilePointer(hFile,0,0,FILE_BEGIN);
ReadFile(hFile,word,len[1],&nRead,NULL);
}else if(nMondai==nword){
SetFilePointer(hFile,len[nMondai-1]+2,0,FILE_BEGIN);
nLen2=len[nMondai]-len[nMondai-1]-2;
ReadFile(hFile,word,nLen2,&nRead,NULL);
}else{
SetFilePointer(hFile,len[nMondai]+2,0,FILE_BEGIN);
nLen2=len[nMondai+1]-len[nMondai]-2;
ReadFile(hFile,word,nLen2,&nRead,NULL);
}
word[nRead]=TEXT('\0');
/***********************************************/
}


//MenuAndDialogリソース
#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"




//
// Menu resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
MYMENU MENU
{
POPUP "ファイル(&F)"
{
MENUITEM "キーワード登録(&K)", IDM_K
MENUITEM "終了(&X)", IDM_END
}
POPUP "設定(&V)"
{
MENUITEM "表示設定(&C)",IDM_V
}
POPUP "ヘルプ(&H)"
{
MENUITEM "バージョン(&A)", IDM_ABOUT
}
}



//
// Dialog resources
//
LANGUAGE LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN
MYDLG DIALOG 0, 0, 280, 200
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
CAPTION "キーワード登録"
FONT 8, "Ms Shell Dlg 2"
{
EDITTEXT IDC_EDIT0, 7, 7, 266, 155, WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_WANTRETURN
DEFPUSHBUTTON "保存", IDM_W, 31, 167, 50, 14
PUSHBUTTON "OK", IDOK, 168, 167, 50, 14
PUSHBUTTON "キャンセル", IDCANCEL, 223, 167, 50, 14
}



LANGUAGE LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN
MYDLG2 DIALOG 0, 0, 186, 67
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_FIXEDSYS | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
CAPTION "表示設定"
FONT 8, "Ms Shell Dlg 2"
{
DEFPUSHBUTTON "OK", IDOK, 129, 7, 50, 14
PUSHBUTTON "キャンセル", IDCANCEL, 129, 24, 50, 14
CONTROL"ランダム(何度も)",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON|WS_GROUP|WS_TABSTOP,18, 20, 70, 10
CONTROL"登録順",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON|WS_TABSTOP,18, 32, 35, 10
CONTROL"ランダム(一度のみ)", IDC_RADIO3,"Button",BS_AUTORADIOBUTTON|WS_TABSTOP,18, 45, 78, 10
GROUPBOX"表示方法", IDC_STATIC, 12, 7, 112, 53
}

#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif

#define IDM_K 201
#define IDM_V 202
#define IDM_END 203
#define IDM_ABOUT 204
#define IDC_EDIT0 300
#define IDM_W 402
#define IDC_RADIO1 1000
#define IDC_RADIO2 1001
#define IDC_RADIO3 1002

tema:プログラミング - Genre:コンピュータ

  1. 2010/03/31(水) 23:32:09|
  2. 報告・雑記
  3. | Track back:0
  4. | Comment:2

Comment

No title No.122

その日が来たらどれだけ汚いか解る・・・
グローバル変数でなくともいい変数もあるだろうし
  1. 2010/04/01(木) 01:40:46 |
  2. URL |
  3. BLACK #-
  4. [ Edit]

No title No.121

ポーカーソフトは中止してしまいましたか
残念です
データ転送ソフト頑張ってください!
ソースの大公開!!!!
実際にプログラム組んだことないので来るべき日が来たら参考にさせていただきます
  1. 2010/04/01(木) 00:11:28 |
  2. URL |
  3. クロさん #-
  4. [ Edit]

Post a comment

Only display to administrator.

Track back

Track Back URL
Track Back to this post(FC2 blog user)