「RGB」を含む日記 RSS

はてなキーワード: RGBとは

2020-05-25

anond:20200525152246

ぜんぶインラインでやりそう

カラーピッカーで出たRGBそのまま使って背景色指定しそう

2020-05-22

anond:20200522195029

光らんメカニカルキーボードを買えよ。

いや待て、光ること自体はそこそこ便利だ。虹色のうるさい感じの設定しなきゃいいんだよ。

それよりもゲーミングキーボードは、キートップ刻印の英字フォントがゴツゴツしたクソダサデザインなやつが多すぎるのが問題

俺は中華のだけどAjazzのAK33RGBって安メカニカルコンパクト型で5000円のを家用に使ってるが、これはフォントも落ち着いてて良い。

虹色に光らせることもできるが単色ミントグリーンで暗め常時点灯にしてる。

ただまあスペースキーロゴちょっとダサいな。

無難なのならAliでXiaomi系のメカニカル買っとけばいいんじゃないか。買おうとしてるかは知らんが。

フルサイズで白バックライト中華軸が4000円。RGBライトcherry軸が6200円。って感じだな今調べたら。

欧米メーカーだとcherry軸使ったゲーミングキーボードで1万円からになるがね。

Corsairのも使ってたことあるけど、まあ軸なんてcherryじゃなくても個人的にゃ大差ないよ。

2020-04-08

anond:20200407235017

人によって色の見え方は違うから信号rgb値を表示しよう

#33ff99は進め、 #ffff66は注意、 #ff0000は止まれ

2020-04-07

anond:20200407234019

見え方じゃなくて語彙の問題の気がする。正確に伝えたいなら、RGB値を16進数表記してほしい。

2020-02-22

無限お金があったら何をするか

ソフトウェア関係
  1. UImatlab言語Pythonフリーソフトを作る。Simlinkのようなモデル開発も用意してArduinoのような低価格ハードモータ制御開発環境を作る。
  2. ↑で、高速で大規模なデータプロットできるようにする。遅いmatplotlibの代わりになるような2Dプロットツールを作る。グラフカスタマイズ簡単にし、研究者時間を奪わないようにする。
  3. ↑で、プロットに使う色を原色ではない使いやすカラーマップ複数用意する。
  4. ↑で、グラフで、強調したい箇所以外を灰色にする。センスの良い強調色を予め用意しておく。
  5. ↑で、グラフパワーポイントに貼り付けられるようにする。複数グラフを並べる時に縦軸と横軸を揃えたり、大きさを揃えたりするのをソフト側で自動化する、もしくは複数候補マウスでえらぶだけである程度の体裁が整うようにする。
  6. ↑で、大規模なデータ場合でも、エントロピー計算し外れ値を強調する。マウスホイールで拡大縮小をスムーズに行えるようにする。
  7. ↑で、3Dシミュレーションリンクできるようにする。物理シミュレーション時に3Dモデル組み込めるようにする。
  8. ↑で、光学シミュレーションができるようにする。
  9. ↑で、物体移動シミュレーションができるようにする。現実自動位置決めステージと連動できるようにする。
ソフトウェア関係
  1. パワーポイントでの資料作成サポートする機能を作る。特にポンチ絵作成
  2. 数式の入力を楽にする。ややこしい記号や微調整をLaTex試行錯誤して時間を奪われるのを防ぐ。
  3. 数式からプログラミング候補を作る。数式は作れたがプログラムに落とし込むまでの時間節約する。
  4. 最初単位入力すると計算後も単位を保持してくれる。表示時に指数ではないわかりやす単位をつけてくれる。単位による桁間違いの防止。
  5. オペレーションリサーチ最適化を楽にできるようにする。事例から選ぶなど。
ソフトウェア関係
  1. PythonでのRAW画像データライブラリを作る。デモザイキングアルゴリズムを選べ試せるようにする。
  2. RAW画像でのセンサー起因のノイズ除去
  3. OpenCVとPillowで足りない処理を整備。RGBの順番をわかりやすくする。ベイヤー以外のセンサー考慮する。自動車向けのRCCC、RCCBなど。
  4. マシンビジョンでの、3Dモデルに対してライティング位置、形状を選べるようにし、検出したい欠陥に対して、最適なライティングを選べるようにする。
  5. ライティング位置と検出したい欠陥に対しての、機械学習用のデータベースを作成する。
  6. 自動位置決めステージ機械学習を連動させる。検出%が上がりやす位置学習最適化する。
ハードウェア関係
  1. 光学除振台を軽い素材で作る
  2. 積分球とバッフル
  3. 分光計
  4. 6軸ナノポジショナ
  5. ビームプロフイラ
  6. フェムト秒レーザ
その他
  1. APPLIED IMAGE社、Imatest社のISO準拠カラーチャートを買う。カメラの性能評価用。
  2. Imatest社のカメラ評価用のLEDライトボックス

2020-01-28

anond:20200128162736

中間色の出し方は、2色のRGBの平均で良いらしいよ。

2019-12-15

anond:20191215150854

きざいがあってもいいならRGB出力がついてるならそこからモニターにつけておす。

なかがいいてんいんがいれば近所のパソコン屋とか、まんきつでもできる

2019-11-13

字書きさんに表紙を頼まれる時の話

少し前に「絵師さんに表紙を頼んだ話」が同人界隈で広く話題になった。

ブログを書いた人の問題点を挙げる方もいれば、

自分はこういった方法絵師さんに依頼し、こんな表紙を描いてもらいました!」

「○○のような伝え方だと情報が伝わりやすいんじゃないかな」

といったような主旨のツイート散見され、

謝礼、リテイクの有無等々も含め界隈全体で様々な議論が巻き起こったことで、結果として

あの話が広まったことは全体的な意識向上に繋がったのかなぁなんて思う。

私は趣味二次創作をしていて時折表紙のご依頼を受けたりしていたので、

これでみんながスムーズにやりとりして素敵な創作物がいっぱい生まれたらいいよね!なんて思っていた。

それでちょっとだけ、私のところにも来る困った依頼者の人が減ったらいいなぁなんて考えてた。

でも体感としてはあんまり減らなかった。

からそういう御心遣いをされる方はあの一件でより意識を強めた感じがあったけど、

多分、そういう困ったご依頼の方は問題自分のことだと捉えていないのかな。

ちょっと大変だったのは

こちから訊かないと基本的情報納期、納品サイズ等)を教えてくれないパターン

・ご自分の中でイメージが固まってないまま依頼されるパターン小説の内容を相談するのはどうかお友達相手にして欲しい)

・AとBのパターン、どちらがいいですか?と訊ね、「A」と言った数日後に「やっぱりBの要素も....」と言われるパターン(Aと答えた段階で絵描き側の作業は進んでいます

・ご自分作品を私が読んでいる前提でお話されるパターン

・リテイクがあまりにも多いパターン

などなど、

ちゃんとして下さる方のほうが多いしそういう方は本当にきっちりして下さるけど、

して下さらない方は複数コンボもざらにある。

私は今までのご依頼全部、お金の類は頂いてないけど、

やりとりのメールを打ちながらこれは最早クライアントとのやりとりのようだな....って仕事してるような気分になったりした。

割と多いのは、本のイメージが依頼の段階であんまり固まっていない方。

ご依頼で個人的に私が伺いたい情報はまず、

納期 報酬の有無 カラーRGB/CMYK)/モノクロ 人物の数や表紙のイメージ 本の内容 背景の有無 題字等の文字デザインの有無 複数枚の場合は枚数とか。 

「表紙描いて欲しい!描いてくれませんか?」

に対して

「うん!いいよ!」

って言うためには、絵描きによって必要情報の量が違うと思うけど、

個人的に最低限これだけの情報必要だなぁって感じ。

でも意外と「表紙描いて欲しい!描いてくれませんか?」でメールが届いたりする。

相手とすっごく仲良しだったらこれでもいいと思うんだけど、

距離がある相手に対してだったらお互いの信頼関係もないんだからもう少し情報が欲しいところ。

ちなみに情報共有の際、その字書きさんがそのCPをどんなCPだとイメージされているか

どんな本にしたいと考えているのか教えて下さらないと、

解釈違いの表紙が出来上がるなどの悲劇が起きることもあると思う。

こだわりが強いなら尚更そのあたりは最初の段階で細かく伝えるべきだし、

その時点で「自分には荷が重いな」って思ったら、絵描き側も断れるし。

ちょっと話は逸れるけど、

そもそも絵描きの中には「お任せで!」って言われたほうがのびのび描けるタイプと、

しっかりイメージの共有をした方が描けるタイプがいる。

私は自分がどっちが描きやすいか言うようにしてるけど、

「色々注文つけたら大変になっちゃうよね」「負担を増やしたくないな」って

相手を思って一歩踏み出せなかったりするなら

一度そのあたりを相手に訊いてみるのもありなんじゃないかな~って思ったりする。

少なくとも私の周りに「こんなのがいいな」を言うことを否定する絵描きは一人もいないし、

お任せが得意な方もがっつりイメージ共有が得意な方も、

字書きさんの理想に少しでも近づけたらいいなって思いながら描いてることに変わりはないし。

だけど、

だけどね。

から小出しに注文を増やしたり、

依頼の段階で言ってたことと注文を変えたりするのはちょっとずるい。

最初は「お任せで」って仰ってたのに、やり取りをしているうちに注文がどんどん増えてきた、とか。

自身原稿が進んでなくて、「やっぱりこう変えて欲しい!」とか。

よくない。

そのたびにこちら側は思いっき軌道修正をすることを余儀なくされたり、

締切が厳しくなったりしちゃう

最初に出された条件で「受けます」ってなったのに

やっぱりこれもこれも!!ってなったら大変だよ。

そういう相手には、手直しができない段階で「やっぱりこれも」って言われる可能性を考えて、

すぐ対応できる段階で何回も確認をとる必要が出てくる。

ものすごくやりとりが増えるし時間がかかる。

友達とかだったら構想段階から一緒に作ったりとかも楽しいと思うんだけど、

そういうことを言ってくる相手に限って友達じゃなかったりする。

どうか

どこまでを伝えるべき情報ちゃんとご自分の中で吟味して

情報最初の段階で出来るだけまとめて依頼して欲しい。

そして一度納得したものに対して簡単に「やっぱりこっちで」って言わないで欲しい。

お金を払って仕事として依頼しているなら

物事はまた変わってくるのかもしれないけど。

無償での依頼だったら、少しでも気をつけてくれたら嬉しい。

私はもう表紙の依頼をあんまり受けないようにしようと思うけど、

ちょっとでもこまったご依頼の方が気付いてくださったらいいな

2019-09-11

重要追記あり】元ラノベ編集視点から見たお互いが納得する為のイラスト発注

可視範囲内で見かけたもっともな指摘を受けていくらか補足・訂正】【100ブクマ突破してたのでちょいちょい追記。】

大昔にラノベ編集者をしてた。そのとき経験を書く。

基本的に、イラストレーターさんにとってラノベイラスト仕事は割に合わない。締切は外道だし、イラストの量も膨大だ。

仮に、ラノベ1冊のイラスト発注するとする。カラーイラストカバー1枚・口絵3枚(口絵4ページに対して単ページ2枚と見開き1枚)の計4枚、本文中のモノクロ10枚が1セットだろう。カラーイラストに5営業日モノクロイラスト1枚に1営業日という計算で、最低でも1冊あたり30営業日=1.5ヶ月分の工数を割いてもらうことになる(厳密にはキャラクターデザイン工数も別途計算しなきゃなのだが、意図的割愛してます)。

【本職の某氏から指摘を受けて気づいたので補足訂正。ここでの「1営業日」は稿料計算の為に出した仮の日数であり、実際のスケジュール調整の参考にしてはならない。たとえば、カバーイラストの「5営業日」などは「発注から完成まで5日で十分」という意味ではない。現実問題として、一つの仕事に丸々5日間かかりっきりになってもらうのは不可能なので、合間合間に別の仕事をしてもらったり、休み休み仕事をしてもらうことを前提にすると、最初発注から納品までどれだけ急ぎでも2週間、最低でも1ヶ月は日数を確保すべきである個人的には、同人仕事を依頼するなら、発注ラフ→線画→仕上げの各プロセスで1ヶ月以上は作業期間を設けて、最初発注からイラスト納品まで3ヶ月くらいは見ておいた方がいいと思う。それくらい開けないと、プロイラストレーターさんは同人イラスト仕事を受けてくれない、というか受けられないのではないか。】。

そうなると、本来なら計算上は人月単価1.5ヶ月分の稿料が発生するのが当たり前であるしかし、様々な事情によって、そんな予算はないわけだ。重版かかりまくった作品とかなら稿料もそれなりになるかとは思うが、中々そうはいかない。

それに加えて大量のリテイク地獄(たまにある)、小説原稿の遅延(よくある)、編集の怠慢による発注書の遅れ(もっとある)などが重なり、外道スケジュールに追い込まれることが多い。結果イラストレーター地獄を見がち。悲しいけどこれ現実なのよね。商業だと利害関係者が膨大なので、どうしても各種調整により色んな問題が発生しがちである

一方で、同人誌の原稿になると、別に本を落としても数十万単位での損害は発生しない。多少の融通は聞くはずである。いまから書くのは、増田イラストレーターさんに仕事をお願いするときに抑えておくべきと考えている、発注時のポイントであるキャラクター発注のコツはぶっちゃけ今でもわからないし増田のやり方が正しかったのか自信もないので割愛し、それより前の基礎的なことだけ書いたつもりだ(増田は以下の内容に加えて「売れるためのデザインや表紙」をディレクションするのが書籍編集仕事だと考えている)。同人イラスト発注したいと考えている方々は参考にしていただけるとありがたい。

原稿料に見合ったお願いをする

350dpiの文庫本表紙サイズの4Cイラスト1000円で依頼するのは正気の沙汰ではない……というのは直感的に理解してもらえると思う。時給1000円として1時間で描けるイラストってどんなもんやねん。ただ、その一方で、カラーイラストに対する金額がわからないのも実情ではないか

この辺りは、「そのイラストを何営業日かけて描いてもらうか」を念頭に考えるのがいいと思う。たとえば、商業イラストレーターさんにイラストを依頼するのであれば、一番安くても人月20万円の仕事(本当に一番安いことを前提です)として、1営業日1万円、前述の通りカラーイラストは1枚につき最低でも5営業日はかかると考えて、5営業日で5万円になる【税金を加味していないという指摘はもっともです。お恥ずかしい。+10%は提示すべきですね…】。

直感的に「高い」と思った方の感覚否定はしない。金銭感覚は人それぞれだ。だが、それでもイラストレーターさんの仕事としては、月20万円分にしかならないのであるあなたイラストレーターに敬意を払うならそれくらいの前提は持ってもらいたい。

もし、様々な事情でそれ以下の予算しか用意できないなら、なにかしらの融通をきかせる必要はあるだろう。たとえば、依頼するイラストの構図を一から考えてもらうのか、こちらで事前に指定するのか。キャラクターデザインを「小説の本文を読んでもらって一から考えてもらう」のか「事前に発注書をガッチガチにかためてそのとおりに作ってもらう」のか。

重要なのはイラストレーターさんの負担を減らすことである。そして、人間は「考える」ことに労力を要するのだ。予算が潤沢ならイラストレーターさんのクリエティティを存分に発揮してもらえばいいが、そうでないならできる限りイラストレーターさんの負担を減らしてあげるべきである

そして、負担を減らすとは、発注における「曖昧さ」をなくすということだ。可能な限り、曖昧発注はしないようにしよう。

※ただし、そういった「ガッチガチ指定」に近づけば近づくほど、イラストレーターさんは「言われたことをやるだけの存在」に近づかざるをえない。発注者と受注者という関係本質的にそうなってしまうかもしれないが、それはそれとしてそのことを嫌がる方もいると思う。発注相手がはじめて連絡する相手なのか、関係性のそれなりにある友人なのかで許容可能曖昧さは変動する。この辺りは臨機応変に考えていただきたい。

重要追記

ごめん大事なこと書き忘れたけど「文庫本表紙カラーイラスト5万」は【商業で】依頼する金額としてめっっっっっちゃ安いからな!!!!!!!!!!!!

「5万で頼むのは相手を額面月収20万扱いすることと同義」くらいの意味で書いたんだけど俺が悪かった!!!!すまん!!!!!!!!

あと「平均的な金額を書け」と言う批判も見たが、本当に申し訳ないことに「元」なので自分のいたところ以外の金額相場を知らんのだ……。

商業であれば許されない金額同人イラスト発注できるのには理由がある。相手趣味とかスケジュールとか工数の簡略化とか」という話です。特に商業イラストだとせっかく描いてくだすったイラストを、様々な理由によって(時には相手感性否定するかたちで)リテイクせざるをえないことが多くて、そういったことを込みで考えると稿料はもっと高くてしかるべきなのだ

発注要件最初にすべて提示する

これは絶対だ。

たとえば、「イラストを1枚お願いしたい」とだけお願いしてあとからイラストの点数を増やすのは一番最悪なパターンだ。最低でも、

は全部伝えること。

発注要件はいくつかのレイヤーを設ける

どちらにとっても不幸なことは「聞いてない!」の発生だ。

  • 絶対に変えられないこと/原則守ってほしいこと」
  • 「できればお願いしたいこと」
  • 可能であればお願いしたいが無理なら不要なこと」
  • こちらでは考えが未定なので、できれば提案していただきたいこと」

といった、いくつかの発注レイヤーを設けておくのが望ましい。柔軟性のレイヤーを設けておかないと、前述のとおりイラストレーターさんを「言われたとおりに描いてもらう存在」として扱うことに繋がりかねない。また、「絶対に変わらない発注要件」を明示しておかないと、イラストレーターさんが仕事に関する予測可能性を確保できない。たとえば、リテイクに関する同意はとりつけておいた方がいい。「リテイクは1回まで」「リテイクを出すときは24時間以内に出す」など。そういった取り決めを設けた上で、取り決めをこちらが破った場合は追加予算を払うといったルールを設ける。

前述の予算問題にも絡むが、あんまり予算が出せないときは「リテイクは絶対に出さない(〇回まで)」といったルールを設け、イラストレーターさんの不安を最小限に抑えるといった心遣いは重要だと思う【ちなみに、実際にラノベイラスト発注したときに「リテイクを出さない」という約束を設けたことは一度もない。あとリテイク費用を出せたこともない。リテイク云々は「最悪利益が出なくてもいい非商業発注」だからこそ簡単に取り決められる話だと認識している】。

小説原稿だけを送りつけない

大変失礼ながら、同人小説原稿は多かれ少なかれ「読みづらい」。本文をイラストレーターさんに読ませることを強要してはならない。その前提でいるべきである。本文をそのまま送りつけて「この話のこのキャラクターを」とお願いするのはもっての他であるイラストなしの長編小説からキャラクターの外見描写を抜き出す作業想像してみてほしい。むっちゃくちゃめんどくさい。

たとえば、女の子イラストを描いてもらうなら

くらいは事前にこちから提示したい。なお、これは「原稿を送ってはならない」という意味ではない。作品雰囲気がわからないのにイラストを描いてもらうの大変なので。小説原稿を送った上でちゃんイラスト指定をまとめておくこと。

この辺りはキャラクター発注書の作り方に踏み込むからそろそろやめておくが(飽きてきたとも言う)、文章で全て書く必要はない。「こういうイメージで」とGoogleで拾った画像を投げるだけでも随分違う。

追記

肝心なことを書き忘れていたが、そもそもの前提として

相手事情確認する

こういった諸々をいきなり提示たからといって、それだけで先方が楽になるとは限らない。相手にも相手事情があるからだ。

相手商業デビューしたイラストレーターさんなら、相手スケジュールを必ず確認しよう。別に相手が締め切りを破るの前提に考えるべき」と言っているのではない。商業仕事の締め切りと、同人仕事の締め切りが重なった場合、当たり前だがイラストレーターさんは商業仕事を優先するに決まっているのだ。イラストレーターさんが商業作家だったり、あるいは商業での仕事が降ってきかけている方だったりする場合は、そのスケジュール可能な限り把握して、その上で「商業を優先した場合同人スケジュール」を逆算すべきなのである

追記

普段その人が描きなれてないものを依頼するなら工数を多く見積もるべき」みたいな話もあるがこれも割愛している。これ以上細かい話になるとボロが出るので。

スケジュールに余裕をもたせる

これをしない人がものすごく多いが、上記のようなスケジュール計算ガチガチにやっても、スケジュールは、絶対に、遅延する。

同人イラストでリテイクや修正を出す事例はどれほどあるかわからないが、たとえばスケジュールの中に修正対応の期間を計算に入れているだろうか。同人誌だったら多少は余裕を持たせられるはずだ。冬コミイラストを仮にお願いするとしたら、仮に11月中旬が最終締め切りだとして、あちらこちらにマージンを設定して提示する締日は10中旬くらいにすべきである

最後

諸々書き殴らせてもらった。思いついたり批判を受けたりしたら適宜追記修正する。

なお、これらは失敗から学んだことであり、書き手増田がそのように振る舞っていたことを意味しない。つまり投稿過去仕事をしたイラストレーターさんへの贖罪意味合いが強い。皆さんは増田のような失敗をしないでいただけるとさいわいだ。

anond:20190519061244

2019-08-21

フィルムカメラみたいにデジカメセンサー手軽に変えられたらいいのに

RAW現像でっていうけど、思った色って出ない。

特に肌色って難しい。

トーンカーブで前に気に入った色とRGB値揃えても、周囲の色が違ってると違ってみえる。


そろそろデジカメフィルムみたいに気分に併せてセンサー変えられるようになるといいのに。

2019-08-10

おい、小池

CMYKRGBのこと、至急教えてください。

おい、小池

CMYKRGBのこと、至急教えてください。

2019-07-28

論文読んだ(VARENN: Graphical representation of spatiotemporal data and application to clima

VARENN: Graphical representation of spatiotemporal data and application to climate studies

https://arxiv.org/abs/1907.09725

感想

8個こ気象データ変数(気温、降水量、、、Table.1に書いてある)を入手している。

最大3変数選択し、RGBにそれぞれの変数の値を入れ、画像に変換。

画像CNNに食わせて学習している。気温・降水量の変化を5種類に分類。

いまいち、この手法の利点が見えてこない。

気象データの増減は、他の変数と強く相関しているはずなので、8変数考慮に入れる理由がわからない。

画像データにする理由もよくわからない。数値データを直接CNNに入れたほうがいいのではないだろうか?

内容

Introduction

1段落

数十年単位気象パターン予測することは現在できていない。

これまでのモデル目的は?何をよそくするためのものなの?

なぜこれまでの研究では10単位予測を試みていないのか?

そもそも10単位気象パターン予測意味はあるのか?

decadal teleconnection patterns(10単位での気象の相関)を知りたいということだが、これを知ることに意味はあるのか?

目的と意義が書かれていない。

最後の行は意味が取れない。

2段目

1-5行目ではCNNによる画像解析について語っている。

5行目、何がHoweverなのだろう。まえでは、CNNで何ができているのかを言っている。次の行ではそのデータの扱いについて語っている(Howeverを使うべき?)。

続く行では、システム必要条件が書かれている。

各行で何を主張しようとしているのかがよくわからないので、全体としてこの段落機能がよくわからない。

最後の行は、著者の信仰について書かれているが不要

3段目

VARENNつまり2次元データ学習機に投げることは、CNNを使う際には普通ことなので主張すべきではない。

8 climatic variablesは具体的になに?

classify decadal interaction patterns of climatic variablesこれはよくわからない。画像データを分類することが目的?なにがしたいの?

Results

1段落

temperature(温度)、precipitation(降水量)のrises,fallsを判別したい。Introductionにかくべきでは?

何を基準にして上下判断しているのか?

2段落データについて

8 spatiotemporal climatic variables はなんの変数Tableに書くだけではなく、本文に書くべきだろう。

climatic variablesを0-1の値にした方法は?割り算?

3段目 データの分類

1段目で言っている上下の分類ではなく新たな分類基準が出現する。

(メモ書き)

T1についてここで言い換えておく。

T1は、学習データ30年間での平均値mu30,後10年の正解データでの平均値mu10

mu10-mu30が5よりおおきい、10年後の気温が5度上昇している。

P.4最後段落

To quantify the similarity among variables, we calculated the Euclidean distances from each target variable to the input variable.

よくわからない。

we examine the effects of the relationships among the variables that were assigned to R, G, and B to the model performance.

どういうこと?

P.5最後から2段目と1段目

よんでない

Conclusion

2段目

よくわからない

3段目

よくわからない。

画像の周期性が任意なのが[13]である

提案手法では、明確な季節を元に次元採用した?

どういう意味だろうか?

提案手法で、RGB変数を入れ込んだことが斬新だと主張しているが、

これを数値データだけにしてCNNに読み込ませた場合はどうなるのか?

同程度の精度を出すのか?

提案では、2次元配列データ画像にしてCNNに読ませている。

3次元配列データにしたら精度は変化するのか?

4段目

AIと言っているが、正確には機械学習手法では?

statistical methods including AI はよくわからない。何が言いたいのだろう

気象パターンを分類することに成功したとは言い難い。せいぜい複値分類とかなにか他に良い言い方があるはず。

We selected以下時間windowについての説明かと思われるが、何を言いたいのかよくわからない。

By comparing以下 意味不明。物理simulationと統計モデル比較することで、accuracyとprecisionを比較できる。なぜ?

実際のデータ比較しないで、モデル同士を比較する意味は何?

Objective以下

よくわからない。

5段目

We believe以下

10年のトレーニングと言っているが、そのデータはこの論文記載されていないのでは?

2019-04-12

anond:20190411215811

プログラミングができるわけでもない一般人だが書かれている内容はだいたい分かった。

ただし何を言いたいのかはサッパリからない。

なぜ「数字」にこだわるのかも分からないし唐突に現れたサンプルプログラム意図が分からない。

ドレミファソラシは「261、293、329、349、391、440、493」

単位ヘルツが抜けていて分かりづらい。

可視光の波長

コンピュータディスプレイは波長ではなくRGB表現されるので分かりづらい。

電気がそれほど流れてないときは白色に光り、たくさん流れているとき赤色に光るLEDがあるとする。

そんなよく分からないLEDを使わずともフルカラーLEDがある。

たとえにマイナー電子部品(?)が登場すると逆に分かりづらい。

それから縦30x横30のLEDから縦70x横70のLEDまでに内接する円の内部(x^2+y^2≦40)がすべて色001であれば、赤い円ができる。

このあたりはよく分からない。

中心座標(50,50)から距離(20)ではないのか?

(「点と円の当たり判定」を各座標ごとに実行)

めちゃくちゃ強い電気

なんかすごそう(小並感)。

ハイレベルとローレベルでなくアナログ値になるということなのだろうか?

その意図が分からない。

コンピュータ内部では数字で何もかもを表現する。

それはたぶん現代人ならみんな知ってると思う。

(ただし数字というよりはビットが基本だが)

「Aは41と表現する」のように人間が決めた

どの文字コードのことを言っているのか分からないので集中できない。

(ためしASCIIコードを調べてみたがAは65だった。また小文字にするとき足す値は32)

かなりシンプルになることが多い。

このサンプルコードは言うほどシンプルだろうか?

一般的には適当なrandomモジュールのようなものを利用するのではないか

(ついでに実用的かを考えるなら曲数が60以上あったときのことが気になる)

今の仕事でも、既存マクロエラー出たときに原因箇所を調べたりするのは出来るけど、そこから何を直したら直るのかわかんない。

欲しいマクロ機能要望とかフローチャートとかは作れるけど、それがプログラムにならない。

フローチャートを作れるのなら元増田必要なのはポケットリファレンス」とか「逆引き~」とかいう類の本ではないだろうか?

(普通に考えればさすがに知っているだろうが念のため)

2019-01-18

anond:20190117174807

ウィンドウズのロゴはこういうコンセプトらしい。

https://enjoy.sso.biglobe.ne.jp/archives/windows_logo/

加法混色(色を加えるほど明るくなる)の三原色RGBレッドグリーンブルー

・減法混色(色を加えると暗くなる)の三原色がCMYシアンマゼンタイエロー(これにKブラックを足すと印刷の四原色)

から絵の具は「赤黄緑青」を四原色にして色を作り出していた。

から強いて言うなら元祖西洋美術なのかな。

ウィンドウズ以外も「新しい物を作り出す」(画家が絵の具から芸術を作るように)という意図を込めたいからこの色をみんな使いたがるんじゃないかと思う(多分)。

ポップな印象を与えつつ、納まりもいいし。

また、うろ覚えから間違ってたら申し訳ないけど、少し歴史的な話をすると、

原色を使った有名な作品としては、ピエト・モンドリアン抽象画がある(ピンこなくても見ればわかるはず)。

https://99designs.jp/blog/design-history-movements-ja/%E3%83%A6%E3%83%BC%E3%83%88%E3%83%94%E3%82%A2%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%97%E3%81%9F%E3%83%87%E3%83%BB%E3%82%B9%E3%83%86%E3%82%A4%E3%83%AB%E9%80%A0%E5%BD%A2%E9%81%8B%E5%8B%95%E3%81%AE%E3%83%93/

モンドリアンが主導した前衛運動デ・ステイルでも原色アイコン化されているので、直接の影響はモンドリアンデ・ステイルにあるのかも知れない。(緑はあまり使われていない気がするが)

また、同時代にはバウハウスロシア構成主義といった「近代的な、機能的で合理的な」表現を目指すモダニズム運動があり、これらも原色を使った表現が特徴。

表現におけるモダニズム」は合理性を重んじているため、ITゲーム界隈と相性がいいのかもしれない。

他に原色といえばデンマーク発祥の「レゴブロック」があるが、デンマークデザインの特徴もシンプルさと機能性。

他にはポップアートなども関連性がありそう。

専門ではないので、話半分に読んで

2019-01-07

anond:20190107195908

たぶん書くならここより、

教えてgooとかの方がいいんじゃないかなと予想。

似た悩みで悩んだことあったけど、解決方法覚えてない;

助けてあげたいけど、解決方法わからん

くすんでるのは別問題可能性ないですか?

実はRGBじゃなくて、CMYKで保存してしまってるとか。

こっちはクリスタ問題かもだけど…

ディスプレイソフトの色設定が上手くいかない(´・ω・`)

Mac Bookカラープロファイルは「カラーLCD」、液タブのプロファイルは「HD 709-A」、CLIP STUDIORGBプロファイルは「sRGB IEC61966-2.1」

…どれが正しいの?!?(´・ω・`)

Macの画面と液タブの色味もビミョーに違う。

クリスタで描いた絵をPNGなりJPEGなりで保存すると色がくすんでしまう。

わけわからんちん。

2019-01-03

anond:20190103193157

結構面倒

過去ブロックを覚えておく領域

int blocks[100][100];

過去ブロックを再描画

	BOOL WriteBoxOLDBox()
	{
		int width = 24;

		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 48));
		for (int y = 0; y < 30; y++)
		{
			for (int x = 0; x < 8; x++)
			{
				if (blocks[y][x] == 0)
				{
					continue;
				}

				RECT Rect = { 0,0,48,48 };
				BOOL ret;

				Rect.left = width * x + 1;
				Rect.right = width * (x + 1) - 1;
				Rect.top = width * y + 1;
				Rect.bottom = width * (y + 1) - 1;

				ret = FillRect(hdc, &Rect, hBrush);


			}
		}

		DeleteObject(hBrush);

		return FALSE;
	}

この辺は めんどくさくはあるけど みてわかってほしい

描画したWriteBoxとおなじ BOXが落ちた場所BOXの有無)を保存しておく

ここがわかりにくいといえば わかりにくい

	BOOL SaveBoxI()
	{
		blocks[y  ][x] = 1;
		blocks[y+1][x] = 1;
		blocks[y+2][x] = 1;
		blocks[y+3][x] = 1;
		return TRUE;
	}

anond:20190103184241

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//

	int blocks[100][100];

	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;
		boxType = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		for(int x = 0 ; x < 100 ; x++)
		{
			for (int y = 0; y < 100; y++)
			{
				blocks[y][x] = 0;
			}
		}

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 100 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	int boxType;

	BOOL WriteBoxOLDBox()
	{
		int width = 24;

		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 48));
		for (int y = 0; y < 30; y++)
		{
			for (int x = 0; x < 8; x++)
			{
				if (blocks[y][x] == 0)
				{
					continue;
				}

				RECT Rect = { 0,0,48,48 };
				BOOL ret;

				Rect.left = width * x + 1;
				Rect.right = width * (x + 1) - 1;
				Rect.top = width * y + 1;
				Rect.bottom = width * (y + 1) - 1;

				ret = FillRect(hdc, &Rect, hBrush);


			}
		}

		DeleteObject(hBrush);

		return FALSE;
	}


	BOOL WriteBox()
	{
		WriteBoxOLDBox();

		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}

		return TRUE;
	}

	BOOL WriteBoxZ()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left += width;
		Rect.right += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);


		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL WriteBoxL()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 246 , 48));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) -1 ;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) -1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left   += width;
		Rect.right  += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL WriteBoxI()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB( 246 , 48 , 48));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL SaveBoxI()
	{
		blocks[y  ][x] = 1;
		blocks[y+1][x] = 1;
		blocks[y+2][x] = 1;
		blocks[y+3][x] = 1;
		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 20) {
			switch (boxType)
			{
			case 0:
				SaveBoxI();
				break;
			case 1:
				break;
			case 2:
				break;
			}

			y = 0;
			boxType++;
			if (boxType > 2)
			{
				boxType = 0;
			}
		}

		this->WriteBox();

		return TRUE;
	}



	BOOL OnKey(WPARAM wParam)
	{
		if (wParam == VK_LEFT)
		{
			x++;
		}
		if (wParam == VK_RIGHT)
		{
			x--;
		}
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey(wParam);
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190103170543

テトリス

落ちてくるブロックの描き方

わかりやす関数化してみた

まずはブロックの種類は3種類

 

WriteBoxLとWriteBoxIとWriteBoxZ

の違いをよく見比べて

自力で違いがわかれば

プログラマーにはなれるとおもう

とはいえ、コレを自力でわかるならもっと儲かる仕事あるとはおもうけどな

 

	BOOL WriteBox()
	{
		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}
	}
// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;
		boxType = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	int boxType;

	BOOL WriteBox()
	{
		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}
	}

	BOOL WriteBoxZ()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left += width;
		Rect.right += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);


		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL WriteBoxL()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) -1 ;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) -1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left   += width;
		Rect.right  += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL WriteBoxI()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 8) {
			y = 0;
			boxType++;
			if (boxType > 2)
			{
				boxType = 0;
			}
		}

		this->WriteBox();

		return TRUE;
	}



	BOOL OnKey()
	{
		x++;
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey();
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190103155208

これで、ブロックを4つ書くからテトリス

	BOOL WriteBox()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) -1 ;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) -1;

		ret = FillRect(hdc, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 8) {
			y = 0;
		}

		this->WriteBox();

		return TRUE;
	}


anond:20190101175055

テトリス風?プログラムに向けて

第何回だろうな

キー入力を追加した

まだ、何を押してもブロックが右に移動するだけ(右端にいくと左にワープ

タイマー自動落下

 

でもまぁ ここまでサンプルがあるとほぼテトリスは見えてきた

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		Rect.left = 48 * x;
		Rect.right = 48 * (x+1);
		Rect.top = 48 * y;
		Rect.bottom = 48 * (y+1);
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 8) {
			y = 0;
		}
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL OnKey()
	{
		x++;
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey();
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

2019-01-01

anond:20190101174449

描画部分の違い

変数 y をつかって

高さが8までで移動するように

yが変わると■のいちも変わるから

タイマーで呼び出されるたbに

下へ 下へと作画される

から まぁ アニメーションに見える

8のところを16に変えれば もっと長いアニメーションになる

次はタイマー部分を説明

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		Rect.top = 48 * y;
		Rect.bottom = 48 * (y+1);
		if (y > 8) {
			y = 0;
		}
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}

anond:20190101172100

タイマーを使ったアニメーションを付けた

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		y = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		Rect.top = 48 * y;
		Rect.bottom = 48 * (y+1);
		if (y > 8) {
			y = 0;
		}
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190101171914

ソース全部だと長いけど ようするに

違いはこの部分

CreateSolidBrush が 色を決めている

Rect で位置と大きさを

FillRectで書いている

英語が読めればかなり簡単

OnPaint=作画関数

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}
ログイン ユーザー登録
ようこそ ゲスト さん