Making スクリーンセーバーのソース公開


Amazon.co.jpアソシエイト


| HOME | オリジナルスクリーンセーバー | おすすめダウンロード | スクリーンセーバーリンク | 映画スクリーンセーバー | CMスクリーンセーバー |



Miscrosoft Visual C++ 6.0で作成したスクリーンセーバーのソースを公開します。ここで公開しているスクリーンセーバーは、ラインをランダムに描画する簡単なものですが、これからスクリーンセーバーを作成しようとする人には参考になると思います。下の画像が実行したスクリーンセーバーの画面です。


ソースはここからダウンロードしてください! ソースダウンロード samplescr.lzh Size:3KB


<samplescr.cppの内容>

// samplescr.cpp : アプリケーション用のエントリ ポイントの定義 // #include "stdafx.h" #include <afxwin.h> // MFC の標準コンポーネント #include <afxext.h> // MFC の拡張部分 #include <afxcmn.h> // MFC の拡張部分 #include <math.h> #include <stdlib.h> #include <direct.h> #include <afxdao.h> #include <mmsystem.h> #include <windowsx.h> #include <commctrl.h> //コモンコントロール用 #include <ctl3d.h> #define SaverClass "SAMPLESCR.gwp" #define SaverTitle "Screen Saver" // 共用メモリ HINSTANCE mainInstH; //メインインスタンスハンドル HWND mainWinH; //メインWindowのハンドル HWND ParentWinH; short winBegX, winBegY; //ウィンドウの表示左上位置 short winSizX, winSizY; //ウィンドウのサイズ short RunningMode; // スクリーンセーバー void Sample( HDC dcH ) { int X1, Y1; int X2, Y2; int R, G, B; HPEN NewPen, OldPen; X1 = rand() % winSizX; Y1 = rand() % winSizY; X2 = rand() % winSizX; Y2 = rand() % winSizY; R = rand() % 256; G = rand() % 256; B = rand() % 256; SetROP2( dcH, R2_XORPEN ); NewPen = CreatePen( PS_SOLID, 1, RGB( R, G, B ) ); OldPen = (HPEN)SelectObject( dcH, NewPen ); MoveToEx( dcH, X1, Y1, NULL ); LineTo( dcH, X2, Y2 ); SelectObject( dcH, OldPen ); DeleteObject( NewPen ); } // スクリーンセーバーの動作モードを取得 BOOL SCRSAVER_GetCmdlineOption( LPSTR CmdLineStr, HWND *ParentWinH, short *RunningMode ) { static char *Opstr[]={"-c", "-C", "/c", "/C", //設定ダイアログ "-p", "-P", "/p", "/P", //プレビュースクリーンセーバー "-s", "-S", "/s", "/S", //フルスクリーンセーバー "-a", "-A", "/a", "/A",}; //パスワード変更 static short Optype[]={ 0, 0, 0, 0, //動作モードの種別 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3 }; short X; char *Pos; *ParentWinH = NULL; if( 0 == lstrlen( CmdLineStr ) ) { *RunningMode = 0; return FALSE; } for( X = 0; X < 16; X ++ ) { if ( ( Pos = strstr( CmdLineStr, Opstr[ X ] ) ) != NULL ) { *RunningMode = Optype[ X ]; *ParentWinH = (HWND)atol( &Pos[ 2 ] ); if ( !*ParentWinH ) *ParentWinH = GetForegroundWindow(); return FALSE; } } return TRUE; } //メインプロシージャ LONG FAR PASCAL WindowProc( HWND winH, UINT msgID, WPARAM wParam, LPARAM lParam ) { static UINT TimerID; static WORD MouseMoveCtr=0; static POINT SaveMousePos; short X, Y; HDC dcH; RECT RectS; switch(msgID){ case WM_CREATE: mainWinH = winH; // タイマーをセット TimerID = SetTimer( winH, NULL, 3, NULL); // 3mmsecの割り込み if ( 1 == RunningMode ) break; GetCursorPos( &SaveMousePos ); ShowCursor( FALSE ); break; case WM_ERASEBKGND: // 背景消去 dcH = GetDC( winH ); GetClientRect ( winH, &RectS ); FillRect( dcH, &RectS, (HBRUSH)GetStockObject( BLACK_BRUSH ) ); ReleaseDC( winH, dcH ); break; case WM_SYSCOMMAND: // 再起動防止 return FALSE; case WM_TIMER: // タイマー割り込み dcH = GetDC( mainWinH ); Sample( dcH ); ReleaseDC( mainWinH, dcH ); break; case WM_MOUSEMOVE: // マウスが動いた if ( 1 == RunningMode ) break; X = abs( SaveMousePos.x - LOWORD( lParam ) ); Y = abs( SaveMousePos.y - HIWORD( lParam ) ); if ( ( ++ MouseMoveCtr > 6 ) && ( X > 3 ) && ( Y > 3 ) ) { // スクリーンセーバー終了 PostMessage( mainWinH, WM_CLOSE, 0, 0 ); return NULL; } break; case WM_LBUTTONDOWN: // マウスの左ボタン押下 case WM_RBUTTONDOWN: // マウスの右ボタン押下 case WM_KEYDOWN: // キーボード押下 case WM_SYSKEYDOWN: // システムキーの押下 if ( 1 == RunningMode ) break; // スクリーンセーバー終了 PostMessage( mainWinH, WM_CLOSE, 0, 0 ); return NULL; case WM_CLOSE: // Windowを閉じる(プレビューモード時) DestroyWindow(winH); break; case WM_DESTROY: // Windowを閉じる(終了) // タイマーを解放する KillTimer( winH, TimerID ); // マウスカーソルを出す ShowCursor( TRUE ); PostQuitMessage( 0 ); return NULL; } return( DefWindowProc( winH, msgID, wParam, lParam) ); } //メインウィンドウを作成 BOOL CreateMainWin( BOOL Type ) { WNDCLASS wc; DWORD exWinType, winStyle; HDC dcH; RECT RectS; //クラスを登録 wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = mainInstH; wc.hIcon = LoadIcon( mainInstH, MAKEINTRESOURCE( IDI_APPLICATION ) ); wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH ); wc.lpszMenuName = NULL; wc.lpszClassName = SaverClass; if ( NULL == RegisterClass( ( WNDCLASS * )&wc ) ) return TRUE; if ( FALSE == Type ) { exWinType = WS_EX_TOPMOST; winStyle = WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS; winBegX = 0; winBegY = 0; dcH = GetDC( NULL ); winSizX = GetDeviceCaps( dcH, HORZRES ); winSizY = GetDeviceCaps( dcH, VERTRES ); ReleaseDC( NULL, dcH ); } else { exWinType = NULL; winStyle = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS; GetWindowRect( ParentWinH, &RectS ); winBegX = 0; winBegY = 0; winSizX = (short)( RectS.right - RectS.left ); winSizY = (short)( RectS.bottom - RectS.top ); } //ウィンドウを生成 mainWinH=CreateWindowEx( exWinType, //拡張情報 SaverClass, //クラス名 SaverTitle, //タイトル名 winStyle, //ウィンドウのスタイル winBegX, //ウィンドウの水平位置(画面左上に配置) winBegY, //ウィンドウの垂直位置(画面左上に配置) winSizX, //ウィンドウの水平サイズ(最大) winSizY, //ウィンドウの垂直サイズ(最大) ParentWinH, //親ウィンドウ NULL, //メニューハンドル mainInstH, //インスタンスハンドル NULL //データアドレス ); if ( !mainWinH ) return TRUE; //ウィンドウが生成できなかった return FALSE; } // メイン int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MSG msgS; mainInstH = hInstance; if( FindWindow( SaverClass, NULL ) ) return NULL; // スクリーンセーバーの動作モードを取得 if ( SCRSAVER_GetCmdlineOption( lpCmdLine, &ParentWinH, &RunningMode ) ) return NULL; switch ( RunningMode ) { case 0: // 設定ダイアログ return NULL; case 1: // プレビュー if ( CreateMainWin( TRUE ) ) { MessageBox( NULL, "Windowに失敗しました!", "初期化エラー", MB_OK|MB_SETFOREGROUND); return NULL; } break; case 2: // フルサイズ if ( CreateMainWin( FALSE ) ) { MessageBox( NULL, "Windowに失敗しました!", "初期化エラー", MB_OK | MB_SETFOREGROUND ); return NULL; } break; case 3: // パスワード変更 return NULL; } //メッセージループ while( GetMessage( &msgS, NULL, NULL, NULL ) ){ TranslateMessage( &msgS ); DispatchMessage( &msgS ); } return( msgS. wParam ); }

|目次 |